Sobes.tech
Middle

Какво се случва с вектора (std::vector) при добавяне на елемент?

sobes.tech AI

Отговор от AI

При добавяне на елемент към std::vector (например, с помощта на push_back) се случват следните стъпки:

  1. Проверка на капацитета: Векторът проверява дали текущо заделената памет (капацитет) е достатъчна за нов елемент.
  2. Разширяване, ако е необходимо:
    • Ако size() < capacity(), новият елемент просто се поставя на следващото свободно място, и size() се увеличава с 1.
    • Ако size() == capacity(), векторът трябва да увеличи капацитета си. Обикновено това става чрез заделяне на нов, по-голям блок памет. Размерът на новия блок обикновено е няколко пъти по-голям от текущия (например, удвояване).
  3. Копиране/преместване на елементи (при разширяване): Всички съществуващи елементи от стария блок памет се копират (или преместват, ако типът на елемента поддържа преместване и има подходящ конструктор/оператор) в новия блок.
  4. Поставяне на новия елемент: Новият елемент се добавя в края на новия блок памет.
  5. Освобождаване на старата памет: Старият блок памет се освобождава.
  6. Актуализиране на указатели/размери: Вътрешните указатели (които сочат към началото и края на данните, както и към края на заделената памет) се актуализират, и стойността на size() също се увеличава.

Тази операция може да бъде скъпа поради възможни преразпределения на паметта, копиране/преместване на елементи и освобождаване на старата памет. Тя също може да инвалидира итератори и препратки, сочещи към елементите на вектора преди добавянето.