Каково значение по умолчанию для итератора? - PullRequest
57 голосов
/ 03 августа 2010

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

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

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

Что будет инициализировано?

Ответы [ 3 ]

51 голосов
/ 03 августа 2010

По соглашению "NULL iterator" для контейнеров, который используется для указания отсутствия результата, сравнивается равным результату 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 входного потока.

22 голосов
/ 03 августа 2010

Конструктор по умолчанию инициализирует итератор с единичным значением :

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

11 голосов
/ 03 августа 2010

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

...