Поскольку этот вопрос набирает столько голосов и становится чем-то вроде FAQ, я думаю, что было бы лучше написать отдельный ответ, чтобы упомянуть одно существенное различие между C ++ 03 и C ++ 11 в отношении влияния std::vectorоперации вставки на действительность итераторов и ссылок относительно reserve()и capacity(), на которые большинство голосовавших не обратили внимания.
C ++ 03:
Перераспределение делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что перераспределение не происходит во время вставок, которые происходят после вызова функции Reserve (), до тех пор, пока вставка не сделает размер вектора больше размера, указанного в последнем вызове Reserve (). .
C ++ 11:
Перераспределение делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что перераспределение не происходит во время вставок, которые происходят после вызова функции Reserve (), до тех пор, пока вставка не сделает размер вектора больше, чем значение Capacity () .
Таким образом, в 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, когда a insert()приводит к тому, что размер вектора достигает значения, указанного в предыдущем reserve()вызове (который может быть меньше текущего, capacity()поскольку a reserve()может привести к большему, capacity()чем запрашиваемый), любое последующее insert()может привести к перераспределению и аннулированию все итераторы и ссылки. В C ++ 11 этого не произойдет, и вы всегда можете доверятьcapacity() с уверенностью знать, что следующее перераспределение не произойдет до того, как размер превысит capacity().
В заключение, если вы работаете с вектором C ++ 03 и хотите убедиться, что перераспределение не произойдет при выполнении вставки, это значение аргумента, который вы ранее передали, с reserve()которым вы должны проверить размер, а не возвращаемое значение вызова capacity(), иначе вы можете удивиться « преждевременному » перераспределению.