2016-01-25 4 views
5

Die "normale" Art und Weise ein Element aus einem Vektor zu löschen geht so:std :: vector :: erase vs "swap und Pop"

vec.erase(vec.begin() + index); 

Aber in der Theorie ist es schneller gerade dies zu tun:

if (vec.size() >= 2) 
{ 
    std::swap(vec.begin() + index, vec.end() - 1); 
    vec.pop_back(); 
} 
else 
{ 
    vec.clear(); 
} 

Gibt es einen Grund, letzteres nicht zu verwenden?

+2

Sie brauchen den normalen Weg, wenn Sie Ordnung bewahren müssen. – zch

+1

Wenn Sie schnell gelöscht werden müssen, können Sie immer eine verkettete Liste verwenden. – CompuChip

+3

@CompuChip Das wird jedoch langsamer als das zweite Beispiel, und verkettete Listen sind im Prinzip langsam-standardmäßig. – Veedrac

Antwort

10

Der zweite Fall behält die Reihenfolge der Elemente im Vektor nicht bei. Wenn dies ein sortierter Vektor ist oder die Reihenfolge wichtig ist, dann haben Sie gerade das im zweiten Fall gebrochen, wo der erste Fall die Reihenfolge intakt belassen würde.

+1

Und wenn die Reihenfolge nicht wichtig ist, dann war ein Vektor wahrscheinlich nicht das richtige Werkzeug für den Job. Obwohl es einige Fälle gibt, in denen die Reihenfolge _so_ unwichtig ist, dass ein Vektor das richtige Werkzeug ist, ist der Job: D –