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