2013-06-07 13 views
6

Ich möchte zwei Sätze mit dem equal Algorithmus vergleichen, aber es gibt mir einen Fehler. Wie ist es möglich zu wissen, ob zwei Sätze gleich sind oder nicht?Wie effizient Sätze in C++ zu vergleichen?

if(equal (a.begin(), a.end(), v.begin(), v.end()) 
+2

hast du 'a == v' versucht? –

Antwort

12

Sie können einfach a == v sagen, oder vielleicht a.size() == v.size() && a == v. Es ist so effizient wie es nur geht. (Letztere Form mit der expliziten Größenprüfung kann besser sein, da Satz Iteratoren sind nicht random-access.) Update: Die Größe Prüfung impliziert

+0

Ich zögere zu sagen, dass "a == b" so schnell/effizient wie möglich ist, da es zusätzliche Vergleiche hinter den Kulissen geben kann oder auch nicht. Ohne die Implementierung zu kennen, kann man nicht sagen, dass sie die schnellste ist. –

+0

@ RichardJ.RossIII: Aber wir kennen die Implementierung, da es angegeben ist. –

+0

Ich dachte, dass die Implementierung selbst nicht angegeben ist, nur das Verhalten, richtig? Verschiedene STL-Implementierungen können sich unterscheiden. –

5

Sie sind die std::equal overload unter 3 wahrscheinlich Aufruf [Dank @juanchopanza!] Iteratoren und ein zusätzliches Prädikat. So lassen Sie das zweite Ende weg, da es nicht als Ende Iterator interpretiert wird, sondern ein Prädikat, das Müll ist:

std::equal(a.begin(), a.end(), v.begin()) 

Aber als Mark in diesem Fall in seinem Kommentar ammends müssen Sie sicherstellen, Achten Sie darauf, dass die Größen beider Behälter übereinstimmen, sonst laufen Sie Gefahr, das Ende des zweiten Satzes zu überschreiten. Beachten Sie, dass C++ 14 in der Tat eine std::equal Überladung einführt, die vier Iteratoren (was Sie beabsichtigt haben) und die die Überprüfung der Größe implizit vorformuliert, aber es scheint, dass Ihre Implementierung dies noch nicht unterstützt.

Ansonsten sind die anderen Antworten und Kommentare richtig, a == v ist viel einfacher, klarer und stromlinienförmiger.

+0

Beachten Sie, dass Sie, wenn Sie 'std :: equal' verwenden, auch zuerst prüfen müssen, ob die Container die gleiche Größe haben, andernfalls könnten Sie am Ende des zweiten laufen. –

+0

@MarkRansom Ja, tatsächlich. –