Sobes.tech
Junior — Middle

Kako se ponaša kontejner std::vector ako pokušate da dodate element kada njegov trenutni veličina dostigne granicu capacity?

sobes.tech АИ

Одговор од АИ

Када у std::vector покушате да додате елемент помоћу push_back или emplace_back, а тренутна величина је једнака capacity (односно, нема слободног резервисаног места), догађа се следеће:

  1. Додељује се нови блок меморије са увећаном капацитетом (обично 1,5 до 2 пута већи од тренутног).
  2. Постојећи елементи се копирају или премештају у нову област меморије.
  3. Стари блок меморије се ослобађа.
  4. Нови елемент се додаје у вектор.

Ово значи да операција додавања у таквом случају може бити скупа по времену због реодељивања меморије и копирања елемената. Стога, ако је унапред познат приближни размер, препоручује се коришћење reserve за резервисање потребне капацитета.

Пример:

std::vector<int> v;
v.reserve(10); // резервишемо место за 10 елемената
for (int i = 0; i < 10; ++i) {
    v.push_back(i); // неће бити реодељивања
}
v.push_back(11); // сада ће капацитет бити увећан, десиће се реодељивање