Da diese Frage so viele Stimmen erhält und zu einer Art FAQ wird, ist es wahrscheinlich besser, eine separate Antwort zu schreiben, um einen signifikanten Unterschied zwischen C ++ 03 und C ++ 11 in Bezug auf die Auswirkungen der std::vector
Einfügeoperation auf die zu erwähnen Gültigkeit von Iteratoren und Verweisen in Bezug auf reserve()
und capacity()
, die die am besten bewertete Antwort nicht bemerkte.
C ++ 03:
Durch die Neuzuweisung werden alle Referenzen, Zeiger und Iteratoren ungültig, die auf die Elemente in der Sequenz verweisen. Es wird garantiert, dass während Einfügungen, die nach einem Aufruf von Reserve () erfolgen, keine Neuzuweisung stattfindet, bis eine Einfügung die Größe des Vektors größer machen würde als die Größe, die im letzten Aufruf von Reserve () angegeben wurde .
C ++ 11:
Durch die Neuzuweisung werden alle Referenzen, Zeiger und Iteratoren ungültig, die auf die Elemente in der Sequenz verweisen. Es wird garantiert, dass während Einfügungen, die nach einem Aufruf von Reserve () erfolgen, keine Neuzuweisung stattfindet, bis eine Einfügung die Größe des Vektors größer als den Wert von Kapazität () machen würde .
In C ++ 03 ist es also nicht " unless the new container size is greater than the previous capacity (in which case all iterators and references are invalidated)
", wie in der anderen Antwort erwähnt, sondern " greater than the size specified in the most recent call to reserve()
". Dies ist eine Sache, die C ++ 03 von C ++ 11 unterscheidet. Wenn in C ++ 03 a insert()
bewirkt , dass die Größe des Vektors den im vorherigen reserve()
Aufruf angegebenen Wert erreicht (der durchaus kleiner als der aktuelle Wert sein kann, capacity()
da a reserve()
zu einem größeren Wert führen kann capacity()
als gewünscht), kann jeder nachfolgende Wert insert()
eine Neuzuweisung verursachen und ungültig machen alle Iteratoren und Referenzen. In C ++ 11 wird dies nicht passieren und Sie können immer darauf vertrauen capacity()
, dass die nächste Neuzuweisung nicht erfolgt, bevor die Größe überschritten wird capacity()
.
Wenn Sie mit einem C ++ 03-Vektor arbeiten und sicherstellen möchten, dass beim Einfügen keine Neuzuweisung erfolgt reserve()
, sollten Sie die Größe überprüfen, anhand derer Sie die Größe überprüfen sollten den Rückgabewert eines Anrufs an capacity()
, andernfalls können Sie sich über eine " vorzeitige " Neuzuweisung wundern .