Назад к вопросам
Junior
107
questionbank

Знаешь ли ты о методах resize и reserve?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Да, знаю.

В контексте стандартных контейнеров C++ (например, std::vector) методы resize и reserve используются для управления размером и емкостью контейнера:

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

    #include <vector>
    
    int main() {
        std::vector<int> v;
        v.reserve(100); // Гарантируем емкость не менее 100
        // Размер v все еще 0
        // Добавление элементов до 100-го, скорее всего, не вызовет перевыделения
        return 0;
    }
    
  • resize(n): Изменяет размер вектора до n.

    • Если n меньше текущего размера, элементы после n-го удаляются.
    • Если n больше текущего размера:
      • Новые элементы добавляются в конец.
      • Если вызывается resize(n, value), новые элементы инициализируются значением value.
      • Если вызывается resize(n), новые элементы инициализируются значением по умолчанию для типа элемента (путем вызова конструктора по умолчанию).
    • Емкость вектора может увеличиться для размещения новых элементов, если это необходимо.
    #include <vector>
    
    int main() {
        std::vector<int> v = {10, 20, 30};
        v.resize(5); // Размер становится 5. Два новых элемента добавлены (инициализированы 0 для int).
        // v теперь {10, 20, 30, 0, 0}
    
        v.resize(2); // Размер становится 2. Элементы 30, 0, 0 удалены.
        // v теперь {10, 20}
    
        v.resize(6, 99); // Размер становится 6. Четыре новых элемента добавлены (инициализированы 99).
        // v теперь {10, 20, 99, 99, 99, 99}
        return 0;
    }
    

Ключевые отличия:

reserve(n) resize(n) / resize(n, value)
Что меняет Емкость (capacity) Размер (size)
Кол-во элементов Не меняется Изменяется до n
Инициализация Не происходит Новые элементы инициализируются (по умолчанию или указанным value)
Перевыделение Может произойти для достижения емкости n Может произойти для достижения размера n