it-swarm.com.de

Prüfen, ob ein Vektor leer ist

Angenommen, ich habe einen std::vector sagen Vector

Nachdem ich nun einige Operationen am Vektor durchgeführt habe (entweder Einfügen oder Löschen), möchte ich überprüfen, ob der Vektor leer ist, und auf dieser Grundlage möchte ich einige Operationen ausführen.

Welcher Ansatz ist besser

Ansatz 1

if (Vector.size() == 0){ /* operations */ }

Ansatz 2

if (Vector.empty()) { /* operations */ }

Was ist ein besserer Ansatz, 1 oder 2?

33
Prasoon Saurav

v.size() == 0 sagt "Ich vergleiche die Größe", prüft aber, ob der Container leer ist. Es gibt einen kleinen Algorithmus zum Verdauen (sehr klein, da er nur aus einem Vergleich besteht), bevor Sie wissen, was er tut.
OTOH, v.empty() macht genau das, was es sagt: Es prüft, ob v leer ist.
Aus diesem Grund bevorzuge ich eindeutig # 2, da es das tut, was es sagt. Deshalb wurde empty() schließlich erfunden.

Es gibt aber auch einen algorithmischen Grund, empty() vorzuziehen: Wenn jemand später std::vector in std::list ändert, könnte v.size() habe O (n). (In C++ 03 ist es garantiert O(1) für std::vector, aber nicht für std::list. Gemäß James 'Kommentar zu Prasoons Antwort it wird O(1) sein für alle Container in C++ 1x.)

40
sbi

Ich würde sagen, Ansatz Nr. 2, da die Methode empty () absichtlich darauf ausgelegt war zu überprüfen, ob ein Vektor leer ist. Sie können auch die Effizienz beider Ansätze überprüfen und dann entscheiden, welcher der bessere ist.

8
Katalonis

Ansatz (2) wäre besser, da empty() unabhängig vom Containertyp immer in einer konstanten Zeit abläuft [d. H. O (1) ].

size() wird auch in O(1) [für std :: vector] ausgeführt, obwohl es möglicherweise in O(n) für std:list [das ist die Implementierung, die als ehrlich definiert wurde] ausgeführt wird.

In Effective STL [Item 4] sagt Scott Meyers

Sie sollten es vorziehen, wenn das Konstrukt leer ist, und der Grund ist einfach: leer ist eine Operation mit konstanter Zeit für alle Standardcontainer, aber für einige Listenimplementierungen dauert die Größe linear.

.....

Egal was passiert, Sie können nichts falsch machen, wenn Sie leer aufrufen, anstatt zu prüfen, ob size () == 0 ist. Rufen Sie also leer auf, wenn Sie wissen möchten, ob ein Container null Elemente enthält.

8
Prasoon Saurav

Normalerweise wird ein Vektor intern als Zeiger auf ein dynamisch zugewiesenes Array implementiert, und Datenelemente enthalten die Variablen capacity und size des Vektors. Die Variable size des Vektors ist die tatsächliche Anzahl der Elemente, während sich die Kapazität auf die Größe des dynamischen Arrays bezieht.

Bei dieser Implementierung ist die Memberfunktion size() einfach ein Getter für das Member size.

Die empty() gibt das Ergebnis des Vergleichs size == 0 zurück.

Beide sind gleichermaßen effizient O(1), sollten jedoch empty() empfohlen werden, wenn Sie prüfen möchten, ob der Vektor leer ist. Denn dafür ist die Funktion da. Dadurch wird Ihr Code leichter lesbar.

3
codaddict

Wenn Sie mit der Programmierung noch nicht vertraut sind, verwenden Sie einen, der mehr Bedeutung für Sie hat. Wenn beispielsweise == 0 für Sie sinnvoller ist als .empty (), verwenden Sie das.

Wenn Sie später Leistungsprobleme haben (was ich stark bezweifle, dass Sie hier haben werden), verwenden Sie eines, das Ihre Leistungsziele erfüllt.

2

Eigentlich machen vector.empty () und vector.size () == 0 das Gleiche . empty vergleicht den Anfang und das Ende und gibt true zurück, wenn sie gleich sind. größe berechnet Anfang und Ende und gibt 0 zurück, wenn es leer ist, um dasselbe mit einer anderen Berechnung auszuführen.

2
Deathlymad

Nur zum Spaß: warum nicht:

if(Vector.begin() == Vector.end())

?

1
Benoit

Gehen Sie leer ().

0
nakiya