Поскольку этот вопрос набирает столько голосов и становится чем-то вроде 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()
, иначе вы можете удивиться « преждевременному » перераспределению.