Gibt es eine Möglichkeit, zwei Vektoren zu vergleichen?
if (vector1 == vector2)
DoSomething();
Hinweis: Derzeit sind diese Vektoren nicht sortiert und enthalten ganzzahlige Werte.
Gibt es eine Möglichkeit, zwei Vektoren zu vergleichen?
if (vector1 == vector2)
DoSomething();
Hinweis: Derzeit sind diese Vektoren nicht sortiert und enthalten ganzzahlige Werte.
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 !!
Antworten:
Ü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.
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();
using namespace std
), anstatt die klareren zu verwenden std::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:
Expression Operational semantics =========== ====================== a == b distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && equal(a.begin(), a.end(), b.begin())
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:
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 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:
Entsprechend der Diskussion hier können Sie zwei Vektoren direkt mit vergleichen
==
if (vector1 == vector2){
//true
}
else{
//false
}
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ürde set_intersection
ich alle Elemente hinzufügen vector1
, dann nach jedem einzelnen Element von vector2
in suchen vector3
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.
set
Objekte erstellt und verglichen werden? Wäre das nicht einfacher, wenn es wirklich erforderlich wäre, die Vektoren nicht zu berühren?