← Назад ко всем вопросам

Что происходит, когда мы вставляем элемент в вектор

1️⃣ Как кратко ответить

При вставке элемента в вектор, если текущая емкость вектора недостаточна, происходит выделение новой памяти с увеличенной емкостью, копирование существующих элементов в новую область памяти и добавление нового элемента. Если емкость достаточна, элемент добавляется без перераспределения памяти.

2️⃣ Подробное объяснение темы

Вектор в C++ — это динамический массив, который может изменять свой размер во время выполнения программы. Он предоставляет удобные методы для добавления, удаления и доступа к элементам. Когда мы вставляем элемент в вектор, происходит несколько важных процессов, которые зависят от текущей емкости вектора.

Емкость и размер

  • Размер (size) — это количество элементов, которые в данный момент содержатся в векторе.
  • Емкость (capacity) — это количество элементов, которые вектор может содержать без необходимости выделения новой памяти.

Процесс вставки элемента

  1. Проверка емкости:

    • Если текущая емкость вектора больше или равна новому размеру (текущий размер плюс один), то новый элемент просто добавляется в конец вектора.
    • Если емкость недостаточна, происходит перераспределение памяти.
  2. Перераспределение памяти:

    • Выделяется новая область памяти, обычно в два раза больше текущей емкости (хотя это зависит от реализации).
    • Все существующие элементы копируются в новую область памяти.
    • Старый блок памяти освобождается.
    • Новый элемент добавляется в конец вектора.
  3. Обновление метаданных:

    • Увеличивается размер вектора.
    • Если была изменена емкость, обновляется информация о новой емкости.

Пример кода

#include <iostream>
#include <vector>
​
int main() {
    std::vector<int> vec; // Создаем пустой вектор
​
    vec.push_back(1); // Вставляем первый элемент
    // Емкость увеличивается, так как вектор был пуст
​
    vec.push_back(2); // Вставляем второй элемент
    // Емкость может остаться прежней, если она достаточна
​
    vec.push_back(3); // Вставляем третий элемент
    // Если емкость недостаточна, происходит перераспределение памяти
​
    for (int i = 0; i < vec.size(); ++i) {
        std::cout << vec[i] << " "; // Выводим элементы вектора
    }
​
    return 0;
}
  • std::vector<int> vec; — создается пустой вектор для хранения элементов типа int.
  • vec.push_back(1); — добавляется первый элемент. Если вектор пуст, выделяется память для хранения элемента.
  • vec.push_back(2); и vec.push_back(3); — добавляются последующие элементы. Если емкость вектора недостаточна, происходит перераспределение памяти.
  • for цикл выводит все элементы вектора.

Зачем это нужно

Вектор удобен для использования, когда требуется динамическое изменение количества элементов. Он автоматически управляет памятью, что упрощает разработку и снижает вероятность ошибок, связанных с управлением памятью. Вектор используется в ситуациях, когда необходимо часто добавлять или удалять элементы, и при этом важен быстрый доступ к элементам по индексу.

Тема: STL: Контейнеры
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки