fragte Daniel: Ich habe mich gefragt, wie die Gleichheit (==) für STL Iteratoren etabliert? Ist es ein einfacher Zeigervergleich (und damit auf Adressen basierend) oder etwas ausgefallener?
Es hängt von der Implementierung ab. Gerade jetzt, auf Visual C++ 2008, sehe ich den folgenden Code (für die Liste Iterator):
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);
}
Sie oben sehen werden, dass es sowohl Code für die Überprüfung der Iterator Gültigkeit und _Ptr
ist ein Zeiger auf ein Listenknoten.
Also ich denke, es gibt sowohl Verifikation, als auch einfache, rohe Zeiger Vergleich.
fragte Daniel: Wenn ich zwei Iteratoren aus zwei verschiedenen Listenobjekte und ich vergleiche sie, wird das Ergebnis immer falsch sein?
Bis jetzt scheint es, dass der Standard zu diesem Thema etwas unklar war. Anscheinend wird sie explizit schreiben, dass diese Art von Operation Ergebnisse nicht definiert hat:
Zitiert: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#446
Das Ergebnis unter Verwendung eines beliebigen Iterator Betrieb (24.2.1 [input.iterators], 24.2.2 [output.iterators], 24.2.3 [forward.iterators], 24.2.4 [bidirektionale.iterators], 24.2.5 [random.access.iterators]) die zwei Iteratorwerte als Argumente verwendet (Fußnote) die waren aus zwei verschiedenen Bereichen erhalten r1 und r2 (einschließlich ihrer Vergangenheit-am-Ende-Werte), die nicht Teilbereiche eines gemeinsamen Bereichs sind ist nicht definiert, sofern nicht explizit anders beschrieben.
Fußnote) Unter anderem sind diese Operationen ==, <, binär - und kopieren Zuordnung
Also ich denke, es ist böse Iterator aus verschiedenen Behältern vergleichen ... ^ _^
Daniel fragte: Was ist, wenn ich einen gültigen Wert mit einem Wert außerhalb des Bereichs vergleiche? Ist das immer falsch?
Wie oben.
Eigentlich nicht zu? Das musst du bestimmt nicht! – xtofl
Die Möglichkeit, Iteratoren aus verschiedenen Containern technisch zu vergleichen, führt dazu, dass MSVC bei Verwendung von 'std :: copy' ... eine lästige Verwarnungswarnung ausgibt ... –