Ein besonders nützlicher Standardalgorithmus ist std::equal
, der wie folgt definiert ist:
Der Algorithmus läuft über den durch [start1, end1)
und
[start2, start2 + (end1 – start1))
und gibt zurück, ob die Elemente im Bereich gleich sind. Beachten Sie, dass der Algorithmus über zwei verschiedene Typen von Eingabe-Iteratoren templatisiert wird.
Warum ist das?
Nehmen wir an, Sie haben std::list<int>
und std::vector<int>
und möchten sehen, ob sie gleich sind. Wenn std::equal
keine anderen Iterator-Typen verwendet, können Sie sie nicht verwenden, da std::list<int>::iterator
nicht den gleichen Typ wie std::vector<int>::iterator
hat.
Dies gilt auch für den gleichen Containertyp, speichert jedoch verschiedene Elemente. A std::vector<int>::iterator
ist nicht identisch mit std::vector<long long>::iterator
und daher könnten Sie diese auch nicht vergleichen, wenn sie für beide Iteratorpaare den gleichen Typ verwenden.
Bis jetzt haben Sie zwei Antworten bekommen, die sich auf Container konzentrieren. Das ist der falsche Fokus. Die grundlegende Datenabstraktion in der STL ist die Sequenz . Eine Sequenz wird durch ein Paar von Iteratoren definiert. Container sind eine Möglichkeit, Sequenzen zu verwalten, aber sie sind nicht die einzige Möglichkeit. Also, geben Sie rechts & lt; g & gt; Antwort:
std::equal
vergleicht zwei Sequenzen auf Gleichheit. Es gibt keinen guten Grund, die Anwendung des Algorithmus auf Sequenzen zu beschränken, die den gleichen Iterator-Typ haben, so dass es keine solche Grenze gibt. Die Sequenzen können unterschiedliche Ursprünge haben und sich auf unterschiedliche Werttypen beziehen.
Sie können beispielsweise überprüfen, ob die in einer Datei mit einer doppelten Doppelrepräsentation dargestellten Werte mit dem Inhalt eines Vektors von Ganzzahlen identisch sind, die im Speicher abgelegt sind. Der Vektor definiert eine Sequenz; Sie können die Iteratoren mit begin()
und end()
aufrufen. Die Datei definiert eine Sequenz; Sie können die Iteratoren aufrufen, indem Sie die Datei mit ifstream
öffnen und ein Paar istream_iterator<double>
-Objekte erstellen. std::equal
(und alle anderen Standardalgorithmen) funktionieren problemlos mit diesen unterschiedlichen Datenquellen und ihren verschiedenen Datentypen.