crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AD
  опции профиля:
сообщение 18.10.2012, 15:39
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вот тестовый код:
#include <list>
#include <algorithm>
#include <iostream>
#include <iterator>

using namespace std;

int main()
{
    std::list<int> my_list;
    my_list.push_back(3);
    my_list.push_back(2);
    my_list.push_back(3);
    my_list.push_back(4);
    my_list.push_back(5);
    my_list.push_back(3);
    my_list.push_back(7);

    int n = 0;

    cout << "Before removing:\n";
    for(list<int>::iterator i=my_list.begin(); i!=my_list.end(); ++i, ++n)
    {
        cout << "list[" << n + 1 << "] " << *i << endl;
    }

    int j = 0;
    for(list<int>::reverse_iterator i=my_list.rbegin(); i!=my_list.rend();)
    {
        if(*i == 3)
        {
            cout << "iteration " << j + 1 << endl;
            ++i;
            my_list.erase(i.base());
            ++j;
        }
        else
            ++i;
    }

    cout << "After removing:\n";
    n = 0;
    for(list<int>::iterator i=my_list.begin(); i!=my_list.end(); ++i, ++n)
    {
        cout << "list[" << n + 1 << "] " << *i << endl;
    }
}

Интересен он следующим. Если заменить первый элемент на неудаляемый (например push_back(1)), то программа нормально выполняется. Если же тестировать указанную версию, то варианты - разные. На моей машине с Ubuntu g++ 4.6.1 он падает. На машине другого форумчанина он тоже падает, как в MSVC, так и в g++ 4.7.1, а вот у третьего форумчанина с g++ 4.6.3 этот код не падает. Что же это? Сразу говорю, что берется старый стандарт, т.е. не 2011. Понятно, что невалидный итератор, но почему же тогда иногда работает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 19.10.2012, 9:05
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


спокойнее ) Всё важно. Я же не для того, чтобы поспорить, а ради истины ))

Цитата
Какие дополнительные задачи решаются

от этого как раз надо плясать. Ну а когда чисто абстрактная задача - она решается ровно одной строкой (цикл там есть, загляни в исходники)

Цитата
Операции добавления и удаления самые важные в данной задаче, потому и используется список.

и это не аргумент для выбора списка. Ты не сказал КАК и ЧТО ты добавляешь и удаляешь.

Если всё остаётся на уровне школьной задачки, то считаем задачу решённой, ок.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.10.2012, 9:19
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Алексей1153 @ 19.10.2012, 10:05) *
спокойнее ) Всё важно. Я же не для того, чтобы поспорить, а ради истины ))

Ее в принципе не существует, потому и, получается, что спор ради спора. Любую задачу можно решить множеством способов. Понятное дело, что не всегда принимается оптимальный вариант, но есть куча побочных факторов, не относящихся прямо к задаче, которые влияют на выбор решения. В данном случае, приводится очевидный кусок кода слегка в упрощенном варианте. Цикл сделан не случайно, так как в реальной задаче сравнение на удаляемый элемент не такое простое, требующее знать отдельные части структуры, которая является элементом списка (конечно же, там не список простых чисел! :)). И даже в упрощенном варианте видна проблема, которую и решают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   Удаление элементов из списка std::list в цикле   18.10.2012, 15:39
- - D_K   Должно работать. Работает не только у меня, но и у...   18.10.2012, 15:43
|- - AD   Цитата(D_K @ 18.10.2012, 16:43) Должно ра...   18.10.2012, 15:51
- - D_K   Ну вот. Видимо дело в том, что при удалении первог...   18.10.2012, 16:02
- - Влад   Код из сообщения #3 успешно отрабатывает в GCC 4.7...   18.10.2012, 16:03
- - D_K   На самом деле через reverse_iterator'ы нельзя ...   18.10.2012, 16:21
- - Влад   Гм. Не подкинешь ссылочку на соответствующий пункт...   18.10.2012, 17:07
- - D_K   Я исхожу из описания std::reverse_iterator(24.4.1 ...   18.10.2012, 17:20
- - Iron Bug   юзать i = my_list.erase(i) или my_list.erase(i++)....   18.10.2012, 20:53
- - D_K   Ну почему же. Должно работать и так: ... for...   19.10.2012, 7:46
- - Алексей1153   а ещё удобнее так td_my_list my_list; my_list...   19.10.2012, 8:24
- - D_K   Насколько я понимаю, изначальный код упрощенный. И...   19.10.2012, 8:29
- - Алексей1153   а зачем нужен именно обратный обход ?   19.10.2012, 8:39
|- - AD   Цитата(Алексей1153 @ 19.10.2012, 9:39) а ...   19.10.2012, 8:43
- - Алексей1153   ну ладно ) извиняться не за что вроде )) а что м...   19.10.2012, 8:53
|- - AD   Цитата(Алексей1153 @ 19.10.2012, 9:53) Ог...   19.10.2012, 8:57
- - Алексей1153   спокойнее ) Всё важно. Я же не для того, чтобы по...   19.10.2012, 9:05
|- - AD   Цитата(Алексей1153 @ 19.10.2012, 10:05) с...   19.10.2012, 9:19
- - D_K   Цитата(Алексей1153 @ 19.10.2012, 10:05) и...   19.10.2012, 11:02
- - Алексей1153   ага, тема про цикл ))   19.10.2012, 12:01
- - Влад   В общем, в результате изучения Стандарта (D_K спас...   19.10.2012, 12:10
- - D_K   Влад, а как же Цитата(24.4.1.1)namespace std { te...   19.10.2012, 15:06
- - Влад   Тут бы я не согласился. Вот этот самый current - и...   19.10.2012, 15:35
- - D_K   ИМХО. Стандарт, в первую очередь, предназначен для...   19.10.2012, 17:10
- - Iron Bug   если вкратце, то erase превращает итератор в так н...   19.10.2012, 19:56
- - D_K   Iron Bug, так не об этом речь. reverse_iterator...   20.10.2012, 15:54
|- - Iron Bug   Цитата(D_K @ 20.10.2012, 18:54) Iron Bug,...   20.10.2012, 19:02
- - D_K   Iron Bug, как вы собираетесь делать erase с revers...   21.10.2012, 23:41
|- - Iron Bug   Цитата(D_K @ 22.10.2012, 2:41) Iron Bug, ...   22.10.2012, 7:15
- - D_K   Неясно, к чему это.   22.10.2012, 11:12


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 17.7.2025, 17:34