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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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