Оскільки це запитання приносить стільки голосів, і це стає питанням FAQ, я вважаю, що було б краще написати окрему відповідь, щоб згадати одну істотну різницю між C ++ 03 та C ++ 11 щодо впливу std::vector
операції вставки 'на дійсність ітераторів та посилань наreserve()
та capacity()
, які найбільш схвалена відповідь не помітила.
C ++ 03:
Перерозподіл скасовує недійсні всі посилання, покажчики та ітератори, що посилаються на елементи в послідовності. Гарантується, що не відбувається перерозподілу під час вставки, яка відбувається після виклику резерву () до моменту, коли вставка зробить розмір вектора більшим за розмір, зазначений в останньому виклику до резерву () .
C ++ 11:
Перерозподіл скасовує недійсні всі посилання, покажчики та ітератори, що посилаються на елементи в послідовності. Гарантується, що не відбувається перерозподілу під час вставки, що відбувається після виклику резерву () до моменту, коли вставка зробить розмір вектора більшим за значення ємності () .
Тож у C ++ 03 це не " unless the new container size is greater than the previous capacity (in which case all iterators and references are invalidated)
", як зазначено в іншій відповіді, натомість має бути " greater than the size specified in the most recent call to reserve()
". Це одне, чим C ++ 03 відрізняється від C ++ 11. У C ++ 03, як тільки insert()
причина призводить до того, що розмір вектора досягає значення, зазначеного в попередньому reserve()
виклику (яке цілком може бути меншим за поточний, capacity()
оскільки a reserve()
може призвести до більшого, capacity()
ніж просили), будь-який наступний insert()
може призвести до перерозподілу та визнання недійсним всі ітератори та посилання. У C ++ 11 цього не відбудеться, і ви завжди можете довіряти, capacity()
що з впевненістю дізнаєтесь, що наступне перерозподіл не відбудеться до того, як розмір перевищить capacity()
.
На закінчення, якщо ви працюєте з вектором C ++ 03 і хочете переконатися, що перерозподіл не відбудеться під час вставки, це значення аргументу, який ви передали раніше, щоб reserve()
ви повинні перевірити розмір, а не повернене значення дзвінка capacity()
, інакше ви можете здивуватися " передчасному " перерозподілу.