C ++ STL-Algorithmus gleich

8

Ein besonders nützlicher Standardalgorithmus ist std::equal , der wie folgt definiert ist:

%Vor%

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?

    
Tika Gurung 22.06.2017, 15:50
quelle

3 Antworten

12

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.

    
NathanOliver 22.06.2017 15:54
quelle
8

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.

    
Pete Becker 22.06.2017 16:46
quelle
5

Es wird auf diese Weise templatisiert, sodass Sie entweder zwei Iteratoren des gleichen Typs oder zwei Iteratoren mit unterschiedlichen Typen übergeben können.



Zum Beispiel:

%Vor%     
Vivick 22.06.2017 15:53
quelle

Tags und Links