Heim > Backend-Entwicklung > C++ > Ist es gültig, Iteratoren aus verschiedenen Containern in C zu vergleichen?

Ist es gültig, Iteratoren aus verschiedenen Containern in C zu vergleichen?

Barbara Streisand
Freigeben: 2024-11-02 09:02:29
Original
1047 Leute haben es durchsucht

Is It Valid to Compare Iterators from Different Containers in C  ?

Vergleich von Iteratoren aus verschiedenen Containern

Bei der Arbeit mit Containern ist es wichtig, die Auswirkungen des Vergleichs von Iteratoren aus verschiedenen Containern zu verstehen. Es stellt sich die Frage: Ist es zulässig, Iteratoren zu vergleichen, die zu unterschiedlichen Containern gehören?

Bedenken Sie den folgenden Code:

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;
std::cout << (foo.begin() == bar.begin());</code>
Nach dem Login kopieren

Wird der Ausdruck foo.begin() == bar.begin() ergibt falsch oder führt zu undefiniertem Verhalten?

Eine genauere Betrachtung des C 11-Standards (n3337) kann Licht in dieses Dilemma bringen:

Iteratoren innerhalb derselben Sequenz

  • Abschnitt 24.2.1 besagt, dass zwei Iteratoren, i und j, als erreichbar gelten, wenn es eine endliche Folge von i Operationen gibt, die i gleich j macht.
  • Wenn j von i aus erreichbar ist , sie verweisen auf Elemente aus derselben Sequenz.

Vergleich von Iteratoren aus verschiedenen Containern

  • ForwardIteratoren, zu denen RandomAccessIterators gehören, unterliegen Abschnitt 24.2. 5.
  • In diesem Abschnitt wird angegeben, dass == nur zum Vergleichen von Iteratoren über dieselbe zugrunde liegende Sequenz verwendet werden kann.

Angesichts dieser Anforderungen ist der Vergleich von Iteratoren aus verschiedenen Containern ein undefiniertes Verhalten.

LWG Issue #446

LWG Issue #446 geht explizit auf diese Frage ein und schlägt folgende Ergänzung zum Standard vor:

„Das Ergebnis von direkt oder Die indirekte Auswertung einer Vergleichsfunktion oder des Binäroperators mit zwei Iteratorwerten als Argumenten, die aus zwei verschiedenen Bereichen r1 und r2 erhalten wurden [...], die keine Unterbereiche eines gemeinsamen Bereichs sind, ist undefiniert, sofern nicht ausdrücklich anders beschrieben >
Zusammenfassend lässt sich sagen, dass der Vergleich von Iteratoren aus unterschiedlichen Containern ein undefiniertes Verhalten ist, und es ist wichtig, diese Einschränkung einzuhalten, wenn Sie benutzerdefinierte Iteratoren schreiben und Container in Ihrem Code bearbeiten.

Das obige ist der detaillierte Inhalt vonIst es gültig, Iteratoren aus verschiedenen Containern in C zu vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage