Что такое значение итератора по умолчанию?


для любого контейнера STL, который я использую, если я объявляю итератор (этого конкретного типа контейнера) с помощью конструктора по умолчанию итератора, к чему будет инициализирован итератор?

например, у меня есть:

std::list<void*> address_list;
std::list<void*>::iterator iter;

для чего будет инициализирован iter?

3   51   2010-08-03 13:26:41

3 ответа:

по соглашению "нулевой итератор" для контейнеров, который используется для указания отсутствия результата, сравнивается с результатом container.end().

 std::vector<X>::iterator iter = std::find(my_vec.begin(), my_vec.end(), x);
 if (iter == my_vec.end()) {
     //no result found; iter points to "nothing"
 }

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

 std::vector<X>::iterator iter;  //no particular value
 iter = some_vector.begin();  //iter is now usable

для других видов итераторы это может быть не так. Например, в случае istream_iterator, построенный по умолчанию итератор представляет (сравнивает равный)istream_iterator который достиг EOF входного потока.

конструктор по умолчанию инициализирует итератор к сингулярная:

итераторы также могут иметь сингулярные значения, которые не связаны с какой-либо последовательностью. [ Пример: после объявления неинициализированного указателя x (как с int* x;), x всегда следует считать сингулярным значением указателя. -конец примера ] результаты большинства выражений не определены для сингулярных значений [24.2.1 §5]

итератор не инициализируется, так как int x; объявляет целое число, которое не инициализировано. Он не имеет правильно определенного значения.