Поведение std :: list: begin (), когда список пуст

Дает ли следующее определенные результаты в терминах стандарта C ++?

std::list<int> myList;
std::list<int>::iterator myIter = myList.begin();    // any issues?
myList.push_back( 123 );
myIter++;                                  // will myIter point to the 123 I pushed?

Я могу проверить это на компиляторе, который я использую ... но мне хотелось бы получить более точный ответ.

 jcoder29 мая 2012 г., 09:36
Я думаю, что это хороший вопрос, потому что это заставило меня задуматься, хм, на самом деле. Это список ... может быть, это сработает ... (Конечно, это не так)

Ответы на вопрос(2)

Решение Вопроса

В этом отношении все стандартные типы итераторов и контейнеров ведут себя одинаково:

§23.2.1 [container.requirements.general] p6

begin() returns an iterator referring to the first element in the container. end() returns an iterator which is the past-the-end value for the container. If the container is empty, then begin() == end();

И таблица 107 в§24.2.3 [input.iterators] требует, чтобы в качестве предварительного условия для++it, it должен быть разыменованным, что не относится к последним итераторам (то есть, что вы получаете отend()), как таковой, вы вступаете в ужасную область неопределенного поведения.

 29 мая 2012 г., 11:35
так что если это былоmyIter-- , это будет указывать на заданное значение?
std::list<int> myList;
std::list<int> myIter = myList.begin();

Итератор имеет то же значение, что и при инициализацииmyList.end(), Итератор инициализируется до позиции «после конца». Даже после того, как вы вставили элемент в список, итератор все еще указывает один за другим. Если вы увеличиваете его, вы вызываете неопределенное поведение.

ОБНОВИТЬ:

Например, если вы скомпилируете свой фрагмент с GCC с -D_GLIBCXX_DEBUG, результирующий исполняемый файл будет прерван:

/usr/include/c++/4.6/debug/safe_iterator.h:236:error: attempt to increment 
    a past-the-end iterator.

Objects involved in the operation:
iterator "this" @ 0x0x7fffc9548fb0 {
type = N11__gnu_debug14_Safe_iteratorINSt9__cxx199814_List_iteratorIiEENSt7__debug4listIiSaIiEEEEE (mutable iterator);
  state = past-the-end;
  references sequence with type `NSt7__debug4listIiSaIiEEE' @ 0x0x7fffc9548fb0
}
zsh: abort (core dumped)  ./listiter
 29 мая 2012 г., 07:27
@omatai:std::list<> не круговая
 29 мая 2012 г., 10:16
@wilx:usually это не так. Но это может быть, более или менее:++end() не определено, так что это может бытьbegin(), Тем не менее, естьN+1 отдельные итераторы, если у вас естьN ценности.
 omatai29 мая 2012 г., 07:26
... за исключением того, что когда у вас есть циклический список, один за другим может дать вам законную начальную точку по некоторым определениям. Так вы абсолютно уверены ... или делаете обоснованное предположение?
 omatai29 мая 2012 г., 07:32
Ах, да - в своем усталом уме я запутался "двусвязно" с "круглым" потому что каждый раз, когда я (много лет назад) составлял двусвязный список, у него всегда была одна голова / хвост, которые заканчивали "кружком". D & APOS; О! Мне нужно идти домой...

Ваш ответ на вопрос