2017-02-05 4 views
0

Verschiebt es alle Elemente von der rechten Seite des Vektors (auf 1 Position links, wenn löschen und verschieben Sie auf 1 Position rechts, wenn einfügen) oder ist es wie eine verkettete Liste (es erstellt eine neue Adresse und eine neue Adresse Auch wenn ich einen Vektor mit einer Zeichenfolge initiiere, wie kümmert es sich um den Speicher Wenn es in einer Sequenz speichert, was passieren würde, wenn wir push_back weiter machen, wenn es sein Maximum erreichtWas passiert, wenn wir Vektor löschen oder einfügen

+0

Wenn Sie sich für Geschwindigkeit interessieren, immer Benchmark, fallen Sie nicht für die alte "O (N) vs O (1) so O (1) ist schneller" Trap. Im Allgemeinen, wenn Sie std :: verwenden und auf Geschwindigkeit achten, ist Vektor fast immer die richtige Option. Jeder andere Container macht "schlechte Dinge" (wo schlechte Dinge bedeutet, Zeiger zu verfolgen - auch Dinge, die keine ungeordnete Karte mögen sollten) – xaxxon

+0

Sie könnten sehen _ "Moderne C++: Was Sie wissen müssen - Herb Sutter" _ von über 46 Minuten in die Präsentation: https://channel9.msdn.com/Events/Build/2014/2-661 Zufällig fügt/löscht mit std :: vector vs. std :: list, der Vektor Leistung besser bis zu 500,00 Elemente (ungefähr) (auch besser als std :: map) –

Antwort

5

Eine std::vector ist (nach dem C++ - Standard) garantiert, die Elemente in einem zusammenhängenden Speicherbereich zu speichern, was bedeutet, dass nein, es ist nicht wie eine verknüpfte Liste, sondern eher wie ein dynamisch zugewiesenes Array push_back Elemente, nachdem der Vektor die Maximale Kapazität Eine Neuzuweisung findet statt und Elemente werden in den neuen Puffer kopiert. Das Gleiche passiert, wenn Sie Elemente einfügen oder löschen, Dinge werden verschoben, so dass diese Operationen im Allgemeinen O (N) und nicht O (1) sind, wie es bei verknüpften Listen der Fall ist.

So sieht es aus wie std::vector ist schlechter als ein std::list. Dies ist jedoch nicht der Fall, da in vielen Anwendungen Leseoperationen die dominierenden sind, für die eine std::vector viel schneller ist als eine std::list aufgrund von Cache-Lokalität und O (1) wahlfreiem Zugriff aufgrund der Tatsache, dass die Elemente zusammenhängend gespeichert werden. Auch push_back ist O (1), außer wenn der Vektor eine Neuzuweisung durchführt (technisch gesehen hat Push_pack die Komplexität von O (1) amortisiert).

+0

Danke, aber wie würde es bestimmen, wie viel Größe es für eine Zeichenfolge reservieren muss, oder behält es nur die Adresse der Zeichenfolge? – user3345850

+0

Was meinen Sie genau mit einem Vektor, der durch eine Zeichenfolge initialisiert wird? Durch eine 'std :: string'? Wenn es ein Vektor von "std :: string" ist, dann weist der Zuordner einfach den Speicher für "std :: string" ** - Objekte ** zu (die alle eine feste Größe haben, dh "sizeof (std :: string)") , letzterer kümmert sich um den eigenen Speicher für den intern gespeicherten String – vsoftco

+0

std :: vector user3345850

Verwandte Themen