Что такое значение итератора по умолчанию?
для любого контейнера STL, который я использую, если я объявляю итератор (этого конкретного типа контейнера) с помощью конструктора по умолчанию итератора, к чему будет инициализирован итератор?
например, у меня есть:
std::list<void*> address_list;
std::list<void*>::iterator iter;
для чего будет инициализирован iter?
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;объявляет целое число, которое не инициализировано. Он не имеет правильно определенного значения.
Comments