Здравствуйте, гость ( Вход | Регистрация )
|
AD |
18.10.2012, 15:39
Сообщение
#1
|
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17
|
Вот тестовый код:
Интересен он следующим. Если заменить первый элемент на неудаляемый (например push_back(1)), то программа нормально выполняется. Если же тестировать указанную версию, то варианты - разные. На моей машине с Ubuntu g++ 4.6.1 он падает. На машине другого форумчанина он тоже падает, как в MSVC, так и в g++ 4.7.1, а вот у третьего форумчанина с g++ 4.6.3 этот код не падает. Что же это? Сразу говорю, что берется старый стандарт, т.е. не 2011. Понятно, что невалидный итератор, но почему же тогда иногда работает? |
|
|
|
![]() |
|
Iron Bug |
19.10.2012, 19:56
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
если вкратце, то erase превращает итератор в так называемое singular value. можно представить его как аналог NULL для указателей. это значение, не принадлежащее ни одному контейнеру. поэтому после erase итератор становится невалиден и постфиксная операция iter++ будет невалидна. а вот если взять префиксный плюс (++iter) прямо внутри вызова erase, то всё будет ok, потому что сначала итератор изменится, а его "старое" значение будет скопировано, копия будет использована в erase и перейдёт в singular value.
Сообщение отредактировал Iron Bug - 19.10.2012, 19:58 |
|
|
|
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
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![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 31.12.2025, 15:27 |