crossplatform.ru

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

> Удаление элементов из списка std::list в цикле
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. Понятно, что невалидный итератор, но почему же тогда иногда работает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Текстовая версия Сейчас: 28.4.2024, 13:39