Ich habe gerade einen Code geschrieben, um das Verhalten von std :: equal zu testen, und bin überrascht davongekommen:
%Vor%Die Ausgabe (eine Überraschung für mich):
%Vor% Beobachtung: Warum überprüft der std :: equal nicht zuerst, ob die 2 Container das haben? selbe size()
? Gab es einen legitimen Grund?
Beobachtung: Warum überprüft das std :: equal nicht zuerst, ob die 2 Container die gleiche Größe haben ()? Gab es einen legitimen Grund?
Wie? Sie übergeben keine Container an die Funktion, Sie übergeben iterators . Die Funktion hat keine Möglichkeit, die Größe des zweiten Containers zu kennen . Alles was es tun kann, ist in gutem Glauben anzunehmen, dass der Benutzer zwei gültige Container-Bereiche durchlief (dh dass der zweite Bereich korrekt als halboffenes Intervall angegeben wurde [ lst2.begin()
, lst2.begin()
- lst1.begin()
+ lst1.end()
] und handle entsprechend.
Sie können immer Ihre eigene Version von equal schreiben, die effektiv das tut, was Sie wollen:
%Vor%Um sicherzustellen, dass beide Bereiche die gleiche Anzahl von Elementen haben, muss die Signatur ein Ende des zweiten Bereichs enthalten.
Es gibt Ihnen die richtige Antwort - Sie haben ihm gesagt, ob die beiden Behälter im Bereich lst1.begin()
bis lst1.end()
gleich sind. Sie vergleichen immer noch zwei leere Listen, solange equal()
betroffen ist. Wenn Sie den zu vergleichenden Code von lst2.begin()
in lst2.end()
ändern, erhalten Sie, was Sie erwartet haben.
C ++ 14 fügte eine Überlastung mit vier Argumenten hinzu, ähnlich der Antwort von R Samuel Klatchko. Und zumindest die beiden von mir überprüften STL-Implementierungen (libc ++ und MSVC) implementieren die naheliegende Distanz-Check-up-Front-Optimierung für Random-Access-Iteratoren.