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
Antwort
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).
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
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
std :: vector
- 1. Java Was passiert, wenn wir einen IO-Stream löschen
- 2. Was passiert, wenn wir cv :: Mat.data überschreiben
- 3. Was passiert, wenn wir eine Webseite aktualisieren?
- 4. Was passiert eigentlich, wenn wir ServiceWorkerRegistration.pushManagersubscribe() aufrufen?
- 5. Was passiert, wenn wir das Versprechen nicht lösen oder ablehnen
- 6. Was passiert, wenn wir networkstream.write() tun?
- 7. Was passiert, wenn wir keine Software testen
- 8. Was passiert, wenn wir ein Array löschen, nachdem wir den Zeiger inkrementiert haben?
- 9. Was bedeutet #Import? Wenn wir #include verwenden, was passiert?
- 10. Was passiert, wenn wir Argumente innerhalb der Funktion übergeben?
- 11. Was passiert, wenn wir ein verteiltes C + A-System partitionieren?
- 12. Was passiert, wenn wir der gleichen Variablen 2 Werte zuweisen?
- 13. Was passiert, wenn Sie diese in C löschen ++
- 14. Was passiert, wenn wir mit einem doppelten Hash-Schlüssel in Dynamo DB einfügen?
- 15. Was passiert, wenn wir einen BroadcastReceiver nicht abmelden?
- 16. Was passiert, wenn wir Objekte in Java nicht serialisieren?
- 17. Was passiert, wenn wir this.setState() in ReactJS verwenden?
- 18. Was passiert, wenn wir die Hashtable in Collections.synchronizedMap() übergeben
- 19. Was passiert, wenn wir zwei Zeiger in C gleichsetzen?
- 20. Wenn wir ein Formular einreichen, was ist passiert?
- 21. Was passiert mit den Auftragspreisen, wenn wir die Standardwährung ändern?
- 22. Was passiert, wenn wir den Wert von undefiniert setzen?
- 23. Was passiert, wenn wir in recaptcha wiederholt falsche Bilder auswählen?
- 24. Was passiert, wenn wir RAII und GOTO kombinieren?
- 25. DatastoreService Stapel löschen. Was passiert, wenn eine Ausnahmebedingung auftritt?
- 26. Was passiert, wenn make_shared
- 27. Was passiert, wenn veröffentlicht
- 28. Was passiert, wenn ich ibdata1 in mysql (LINUX) löschen
- 29. Sollten wir vor oder nach dem Löschen für einen Zeiger im Vektor löschen?
- 30. Was passiert, wenn wir UIlabel dem Hintergrund-Thread in GCD oder NSOperationQueue geben
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
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) –