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