Когда vector::push_back увеличивает пропускную способность?

Я использую кучу std::vectors, устанавливая их вместимость в начале и используя push_back, чтобы постепенно их заполнить. Большинство этих векторов будут иметь одинаковый размер (16 элементов), хотя некоторые из них могут стать больше. Если я сначала использую push_back 16 раз для вектора с размером 0 и емкостью 16, могу ли я быть уверен, что емкость будет ровно 16 после push_backs?


person zounds    schedule 15.02.2013    source источник
comment
Должно быть так, а вы пробовали?   -  person Karthik T    schedule 15.02.2013
comment
Когда вы добавили больше элементов, чем текущая емкость, вектор увеличит емкость.   -  person andre    schedule 15.02.2013
comment
Не резервируйте емкость вообще, пока не продемонстрируете прирост производительности в критически важном компоненте вашего приложения. Чистая преждевременная оптимизация.   -  person djechlin    schedule 15.02.2013
comment
@djechlin: это также можно сделать для обеспечения достоверности итератора / указателя, вообще не интересуясь оптимизацией.   -  person Jerry Coffin    schedule 15.02.2013


Ответы (3)


Да — после того, как вы зарезервируете определенную емкость, вектор не будет перераспределен до тех пор, пока вы не превысите установленную вами емкость1. Точное количество элементов, которые вы можете отправить без перераспределения, не указано, но вам гарантировано как минимум это количество.


  1. В частности, указатели и итераторы в векторе гарантированно останутся действительными до тех пор, пока вы не превысите указанную емкость.
person Jerry Coffin    schedule 15.02.2013

23.3.6.5 [vector modifiers]

void push_back(const T& x);
void push_back(T&& x);

Примечания. Вызывает перераспределение, если новый размер превышает старую емкость.

Довольно много пояснений.

person Bartek Banachewicz    schedule 15.02.2013

Ага.

23.3.6.3p6:

Никакого перераспределения не должно происходить во время вставок, которые происходят после вызова reserve(), до тех пор, пока вставка не сделает размер вектора больше, чем значение capacity().

person aschepler    schedule 15.02.2013