Дэниел спросил: мне было интересно, как равенство (==) создан для 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 [bidirectional.iterators], 24.2.5 [random.access.iterators]) , который использует два значения итератора в качестве аргументов (сноска) которые были полученные из двух разных диапазонов r1 и r2 (включая их значения конца прошлого), которые не являются поддиапазонами одного общего диапазона не определено, если явно не указано иначе.
сноска) Среди других эти операции ==, <, бинарная - и скопировать назначение
Так что я предполагаю, что это зло сравнить итератор из разных контейнеров ... ^ _^
Daniel спросил: А что, если я сравню действительное значение с тем, что выходит за пределы допустимого диапазона? Это всегда ложь?
То же, что и выше.
На самом деле не должно быть? Вы, конечно же, не должны! – xtofl
Возможность технически сравнивать итераторы из разных контейнеров делает MSVC источником раздражающего предупреждения об устаревании при использовании 'std :: copy' ... –