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 !!
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 )
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:
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.
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.
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)) .
std::equals
zur 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 !!vector
unterstützt sowohl==
und<
Typ VergleicheAntworten:
Überprüfen Sie die
std::mismatch
Methode 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 ++
quelle
lexicographical_compare
funktioniert auch hier und macht es überflüssig, sich mit der Reichweite zu befassen, die die größere Reichweite ist.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();
quelle
using namespace std
), anstatt die klareren zu verwendenstd::equal
.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:
Der
distance
Teil 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:und in Abschnitt 25.2.11 "Gleich" finden wir seine Definition:
In unserem Fall kümmern wir uns um die überladene Version ohne
BinaryPredicate
Version, 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:
quelle
Entsprechend der Diskussion hier können Sie zwei Vektoren direkt mit vergleichen
if (vector1 == vector2){ //true } else{ //false }
quelle
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
vector3
und so zu tun, als würdeset_intersection
ich alle Elemente hinzufügenvector1
, dann nach jedem einzelnen Element vonvector2
in suchenvector3
und 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.
quelle
set
Objekte erstellt und verglichen werden? Wäre das nicht einfacher, wenn es wirklich erforderlich wäre, die Vektoren nicht zu berühren?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)
) .