Для какого-либо контейнера STL, который я использую, если я объявляю итератор (этого конкретного контейнерного типа) использование конструктора по умолчанию итератора, к чему будет инициализирован итератор?
Например, я имею:
std::list<void*> address_list;
std::list<void*>::iterator iter;
К чему будет инициализирован проход?
По соглашению "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 входного потока.
Конструктор по умолчанию инициализирует итератор на единичное значение:
Итераторы также могут иметь единичные значения, не связанные с какой-либо последовательностью. [ Пример: После объявления неинициализированного указателя x (как в случае int* x;), всегда следует считать, что x имеет сингулярное значение указателя. -конец примера ] Результаты большинства выражений не определены для сингулярных значений [24.2.1 §5]
Итератор не инициализирован, так же как int x;
объявляет целое число, которое не инициализировано. Оно не имеет правильно определенного значения.