Я использую кучу std::vectors
, устанавливая их вместимость в начале и используя push_back
, чтобы постепенно их заполнить. Большинство этих векторов будут иметь одинаковый размер (16 элементов), хотя некоторые из них могут стать больше. Если я сначала использую push_back
16 раз для вектора с размером 0 и емкостью 16, могу ли я быть уверен, что емкость будет ровно 16 после push_backs
?
Когда vector::push_back увеличивает пропускную способность?
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. Точное количество элементов, которые вы можете отправить без перераспределения, не указано, но вам гарантировано как минимум это количество.
- В частности, указатели и итераторы в векторе гарантированно останутся действительными до тех пор, пока вы не превысите указанную емкость.
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