Wird der Schwanz eines Vektors (durch Löschen) effizient gelöscht?

8

Wenn Sie v.erase(some_iterator);

tun

Sind Implementierungen intelligent genug, um keine Neuzuweisungen / Byte-Kopien vorzunehmen, da wir nur die Größe aktualisieren können? (Im Gegensatz zum Löschen von streng inneren Elementen.)

    
user2370139 16.05.2017, 11:14
quelle

2 Antworten

11

Das Löschen von std::vector macht Iteratoren und Referenzen auf die Elemente vor dem ersten gelöschten Element nicht ungültig.

Wenn Sie also nur das letzte Element löschen, ist garantiert, dass alle anderen Elemente dort bleiben, wo sie sind, sie werden nicht verschoben oder kopiert.

Beachten Sie jedoch, dass das Löschen von std::vector im Allgemeinen nur seine Größe und nicht seine Kapazität ändert, sodass der Speicher, in dem sich die alten Objekte befanden, immer noch im Besitz von vector ist. Dies ist aus Performance-Gründen und nichts, worüber Sie sich Sorgen machen müssen (es sei denn, Sie haben keinen RAM mehr).

Außerdem werden die gelöschten Objekte natürlich richtig zerstört, so dass ihre Destruktoren zusätzlich zur Anpassung der Größe vector ausgeführt werden müssen, wenn sie nicht einfach zu vernichten sind.

    
Baum mit Augen 16.05.2017, 11:17
quelle
0

Die Vektorkapazität wird nicht durch Löschen geändert. Nur der Zeiger zum Ende wird geändert. Verwenden Sie shrink_to_fit (C ++ 11), um Speicher wirklich freizugeben

%Vor%

gibt aus:

%Vor%     
Saint-Martin 16.05.2017 21:16
quelle

Tags und Links