Даниил спросил:
Мне было интересно, как устанавливается равенство (==) для итераторов STL? Это простое сравнение указателей (и, следовательно, основанное на адресах) или что-то более причудливое?
Это зависит от реализации. Прямо сейчас в Visual C ++ 2008 я вижу следующий код (для итератора списка):
bool operator==(const _Myt_iter& _Right) const
{ // test for iterator equality
#if _HAS_ITERATOR_DEBUGGING
_Compat(_Right);
#else
_SCL_SECURE_TRAITS_VALIDATE(this->_Has_container() && this->_Same_container(_Right));
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Ptr == _Right._Ptr);
}
Вы увидите выше, что есть и код для проверки правильности итератора, и _Ptr
, являющийся указателем на узел списка.
Так что я думаю, что есть и проверка, и простое сравнение необработанных указателей.
Даниил спросил:
Если у меня есть два итератора из двух разных объектов списка, и я сравниваю их, будет ли результат всегда ложным?
До сих пор кажется, что стандарт был несколько неясен по этому вопросу. Видимо, они явно напишут, что операция такого типа имеет неопределенные результаты:
Цитирование: http://www.open -std.org / jtc1 / sc22 / wg21 / docs / lwg-active.html # 446
Результат использования любой операции итератора (24.2.1 [input.iterators], 24.2.2 [output.iterators], 24.2.3 [forward.iterators], 24.2.4 [двунаправленный. итераторы], 24.2.5 [random.access.iterators]) , который использует два значения итератора в качестве аргументов (сноска) , которые были получены из двух разных диапазонов r1 и r2 (включая их прошлое конечные значения), которые не являются поддиапазонами одного общего диапазона , не определено , если явно не указано иное.
сноска) Среди других этих операций: ==, <, двоичное - и копирование </p>
Так что я думаю, что сравнивать итератор из разных контейнеров - это зло
^ _ ^
Даниил спросил:
Как насчет того, чтобы сравнить действительное значение с тем, которое выходит за пределы допустимого диапазона? Это всегда ложно?
То же, что и выше.