Делает ли std :: list :: clear недействительным итератор std :: list :: end?

Проверьте этот код:

#include "stdafx.h"#include <list>

int _tmain(int argc, _TCHAR* argv[])
{
std::list<int> mylist;
mylist.push_back(1);
std::list<int>::iterator i = mylist.end();
if( i == mylist.end() )
printf( "end is end\n" );

mylist.clear();
if( i == mylist.end() )
printf( "never get here because Microsoft seems to ""think the iterator is no longer safe.\n" );

return 0;
}

Теперь согласно cplusplus.com это не должно быть проблемой, и в режиме релиза я думаю, что это нормально и не вызывает никаких проблем, но отладка становится невозможной, так как это просто выдает ошибку, не давая мне продолжить. Есть указатели?

10

Решение

Другие ответы указывают на то, что в общем случае нельзя полагаться, что последний итератор контейнера остается действительным, когда контейнер очищается. Тем не менее, последний итератор списка должен действительно оставаться действительным:

C ++ 11 23.3.5.4/3 Последствия: Делает недействительными только итераторы и ссылки на стертые элементы.

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

10

Другие решения

Из C ++ 11, Таблица 100 (Требования к контейнеру последовательностей):

clear() […] может лишить законной силы итератор.

А также std::list это, конечно, шаблон контейнера последовательности (23.3.5.1/2):

Список удовлетворяет всем требованиям контейнера, обратимого контейнера (приведен в двух таблицах в 23.2), контейнера последовательности, включая большинство необязательных требований к контейнеру последовательностей (23.2.3) и контейнера, учитывающего распределитель (таблица 99). Исключениями являются оператор [] и функции-члены, которые не предусмотрены. Описания предоставлены здесь только для операций над списком, которые не описаны ни в одной из этих таблиц. или для операций, где есть дополнительная семантическая информация.

4

Это на самом деле неверно.
Итераторы действительны только для контейнера текущего состояния.
После добавления или удаления элементов итератор становится недействительным.

В статье, на которую вы ссылаетесь, не говорится, что вы делаете правильно. Они получают новый итератор после очистки.

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

-2
По вопросам рекламы [email protected]