Wie vergleiche ich zwei Vektoren für Gleichheit Element für Element in C ++?


73

Gibt es eine Möglichkeit, zwei Vektoren zu vergleichen?

if (vector1 == vector2)
    DoSomething();

Hinweis: Derzeit sind diese Vektoren nicht sortiert und enthalten ganzzahlige Werte.


25
Sie meinen, Sie möchten unabhängig von der Reihenfolge der Elemente im Vektor vergleichen? Andernfalls sollte der obige Code funktionieren.
Naveen

1
Eine einfache Möglichkeit zum Vergleichen, wenn zwei unsortierte Arrays, deren Überprüfung Sie überprüfen möchten, genau dieselben Werte enthalten, besteht darin, sie zu sortieren und anschließend eine der Standardbibliotheksmethoden zu verwenden, um einen Vergleich durchzuführen.

Wenn es nur so einfach wäre. VS2013 wird std::equalszur Implementierung verwendet ==und dann zur Laufzeit bestätigt, da die Iteratoren nicht aus demselben Container stammen (!). Sie müssen für alle Projekte festlegen _ITERATOR_DEBUG_LEVEL=1(oder =0), die verwenden oder möglicherweise verwenden ==. Arg !!
Cameron

cplusplus.com/reference/vector/vector/operators vector unterstützt sowohl ==und <Typ Vergleiche
Andrew

Antworten:


23

Überprüfen Sie die std::mismatchMethode von C ++.

Das Vergleichen von Vektoren wurde im DaniWeb-Forum diskutiert und auch beantwortet .

C ++: Vergleich zweier Vektoren

Überprüfen Sie den folgenden SO-Beitrag. wird für Sie hilfreich sein. Sie haben das gleiche mit der Different-2-Methode erreicht.

Vergleichen Sie zwei Vektoren C ++


Muss dafür der Bereich sortiert werden?
Naveen

2
lexicographical_comparefunktioniert auch hier und macht es überflüssig, sich mit der Reichweite zu befassen, die die größere Reichweite ist.
Billy ONeal

14
Bitte posten Sie die Details des Links, auf den Sie sich beziehen, hier. Wenn dieser Link in Zukunft ausfällt, wird die gesamte Antwort unbrauchbar.
Alok Save

36
Falsche Antwort. Sie sollten ein Codebeispiel bereitstellen, nicht nur Links - was ist, wenn sie ausfallen?
Primož Kralj

Beachten Sie, dass dies keine Auswirkungen auf ungeordnete Vektoren mit beliebiger Elementreihenfolge hat : coliru.stacked-crooked.com/a/b66b432234265b7e coliru.stacked-crooked.com/a/66300e8d00a16abf
Zoe

71

Ihr Code ( vector1 == vector2) hat die korrekte C ++ - Syntax. Es gibt einen ==Operator für Vektoren.

Wenn Sie einen kurzen Vektor mit einem Teil eines längeren Vektors vergleichen möchten, können Sie den equal()Operator für Vektoren verwenden. ( Dokumentation hier )

Hier ist ein Beispiel:

using namespace std;

if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
    DoSomething();

3
std :: gleich () gilt auch für einfache Arrays, während der Gleichheitsoperator beispielsweise nicht lautet: int a [1000], b [1000]; if (std :: gleich (a, a + 1000, b)) DoSomething ();
Mohamed El-Nakib

3
Gute Antwort, außer dass es schlechte Praktiken fördert ( using namespace std), anstatt die klareren zu verwenden std::equal.
Fritz

4

C ++ 11 Standard ==fürstd::vector

Andere haben erwähnt, dass operator==Vektorinhalte verglichen werden und funktionieren, aber hier ist ein Zitat aus dem C ++ 11 N3337-Standardentwurf, von dem ich glaube, dass er dies impliziert.

Wir schauen uns zunächst Kapitel 23.2.1 "Allgemeine Containeranforderungen" an, in dem Dinge dokumentiert sind, die für alle Container gültig sein müssen , auch deshalb std::vector.

Der Abschnitt Tabelle 96 "Containeranforderungen", der einen Eintrag enthält:

Expression   Operational semantics
===========  ======================
a == b       distance(a.begin(), a.end()) == distance(b.begin(), b.end()) &&
             equal(a.begin(), a.end(), b.begin())

Der distanceTeil der Semantik bedeutet, dass die Größe beider Container gleich ist, jedoch für nicht adressierbare Container mit nicht wahlfreiem Zugriff verallgemeinert iteratorfreundlich angegeben wird. distance()ist unter 24.4.4 "Iteratoroperationen" definiert.

Dann ist die Schlüsselfrage, was equal()bedeutet. Am Ende der Tabelle sehen wir:

Anmerkungen: Der Algorithmus gleich () ist in Abschnitt 25 definiert.

und in Abschnitt 25.2.11 "Gleich" finden wir seine Definition:

template<class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2);

template<class InputIterator1, class InputIterator2,
class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2, BinaryPredicate pred);

1 Rückgabe: true, wenn für jeden Iterator i im Bereich [first1,last1)die folgenden entsprechenden Bedingungen gelten: *i == *(first2 + (i - first1)), pred(*i, *(first2 + (i - first1))) != false. Andernfalls wird false zurückgegeben.

In unserem Fall kümmern wir uns um die überladene Version ohne BinaryPredicateVersion, die der ersten Pseudocode-Definition entspricht *i == *(first2 + (i - first1)), die wir nur als iteratorfreundliche Definition von "alle iterierten Elemente sind gleich" sehen.

Ähnliche Fragen für andere Container:



1

Wenn sie wirklich unbedingt unsortiert bleiben müssen (was sie wirklich nicht tun ... und wenn Sie mit Hunderttausenden von Elementen zu tun haben, muss ich fragen, warum Sie solche Vektoren vergleichen würden), können Sie einen Vergleich zusammen hacken Methode, die mit unsortierten Arrays arbeitet.

Die einzige Möglichkeit, dies zu tun, bestand darin, ein temporäres Element zu erstellen vector3und so zu tun, als würde set_intersectionich alle Elemente hinzufügen vector1, dann nach jedem einzelnen Element von vector2in suchen vector3und es entfernen, wenn es gefunden wird. Ich weiß, das klingt schrecklich, aber deshalb schreibe ich in Kürze keine C ++ - Standardbibliotheken mehr.

Wirklich, sortieren Sie sie einfach zuerst.


oder können zwei setObjekte erstellt und verglichen werden? Wäre das nicht einfacher, wenn es wirklich erforderlich wäre, die Vektoren nicht zu berühren?
Naveen

Hängt davon ab, wie schnell N Such- und Entfernungsoperationen für einen Vektor ( N*O(N)) im Vergleich zu 2 Mengenkonstruktoren sind, die N Elemente sortieren (die Referenz von cplusplus.com lautet "Für unsortierte Sequenzen linearithmisch (N * logN) ..") + einen sortierten Vergleich ( O(N)) .
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.