Подтвердить что ты не робот

Does std:: list:: clear invalidate std:: list:: end iterator?

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

#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, это не должно быть проблемой, и в режиме выпуска я думаю, что это нормально, t действительно вызывает какие-либо проблемы, но отладка становится невозможной, так как это просто освобождает, не позволяя мне продолжать. Любые указатели?

4b9b3361

Ответ 1

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

С++ 11 23.3.5.4/3 Эффекты: аннулирует только итераторы и ссылки на стираемые элементы.

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

Ответ 2

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

clear() [...] может аннулировать итератор прошедшего конца.

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

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

Ответ 3

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

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

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