C++ <vector> функция capacity

класс контейнера C++ <vector>


capacityиспользуется в vector длязапроса capacity: функция, которая возвращает размер пространства хранения, выделенного в данный момент контейнером.

capacityявляется функцией-членом классов-контейнеров, используется дляВозвращает количество элементов, которое может вместить текущий выделенный объём памяти контейнера. Это значение обычно больше или равноsize()。

capacityОтражает предварительно выделенное пространство памяти внутри vector; понимание этого помогает оптимизировать производительность программы и избежать ненужного перераспределения памяти.

Определения слов: capacityОзначает «capacity», то есть количество элементов, которое может вместить контейнер.


Базовый синтаксис и параметры

capacityЯвляется функцией-членом класса-контейнера; для её вызова не требуется параметров.

Формат синтаксиса

size_type capacity() const;

Описание параметра

  • Параметр: Нет параметров
    • capacityне принимает никаких параметров.

Описание функции

  • Возвращаемое значение: возвращаетsize_typeТип (обычноsize_t), указывая на количество элементов, которое может вместить текущее выделенное пространство памяти контейнера.
  • Действие: Возвращает неотрицательное целое число, представляющее объём памяти, выделенный контейнером.
  • Примечание: capacity()Возвращает capacity, а не количество элементов. Для количества элементов используйтеsize()Получить.

Пример

Давайте тщательно освоим на серии примеровcapacityИспользование.

Пример 1: Базовое использование — просмотр capacity

Пример

#include <iostream>
#include <vector>

int main() {
    // Пустой vector
    std::vector<int> emptyVec;
    std::cout << "Пустой vector - размер: " << emptyVec.size()
              << ", ёмкость: " << emptyVec.capacity() << std::endl;

    // Вектор с элементами
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::cout << "вектор из 5 элементов - размер: " << numbers.size()
              << ", вместимость: " << numbers.capacity() << std::endl;

    return 0;
}

Ожидаемый результат:

空 vector - size: 0, capacity: 0
5 元素 vector - size: 5, capacity: 5

Анализ кода:

  1. пустого вектораcapacity()равен 0.
  2. Вектор с 5 элементамиcapacity()Не менее 5 (может быть больше, в зависимости от реализации).

Пример 2: связь между размером и вместимостью

ПониманиеsizeиcapacityЭта разница — основа оптимизации использования вектора.

Пример

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;

    // Постепенно добавляйте элементы и наблюдайте за изменением вместимости
    std::cout << "Изменения размера и вместимости при добавлении элементов:" << std::endl;

    for(int i = 0; i < 15; ++i) {
        v.push_back(i);
        std::cout << "После добавления " << (i + 1) << " элементов - размер: "
                  << v.size() << ", вместимость: " << v.capacity() << std::endl;
    }

    return 0;
}

Ожидаемый результат (типичный вывод):

添加元素过程中 size 和 capacity 的变化:
添加 1 个元素后 - size: 1, capacity: 1
添加 2 个元素后 - size: 2, capacity: 2
添加 3 个元素后 - size: 3, capacity: 4
添加 4 个元素后 - size: 4, capacity: 4
添加 5 个元素后 - size: 5, capacity: 8
添加 6 个元素后 - size: 6, capacity: 8
添加 7 个元素后 - size: 7, capacity: 8
添加 8 个元素后 - size: 8, capacity: 8
添加 9 个元素后 - size: 9, capacity: 16
添加 10 个元素后 - size: 10, capacity: 16
添加 11 个元素后 - size: 11, capacity: 16
添加 12 个元素后 - size: 12, capacity: 16
添加 13 个元素后 - size: 13, capacity: 16
添加 14 个元素后 - size: 14, capacity: 16
添加 15 个元素后 - size: 15, capacity: 16

Анализ кода:

  • Вместимость вектора растёт экспоненциально (обычно в 2 раза).
  • Когда вместимости недостаточно, вектор выделяет больше памяти (обычно вдвое больше текущей вместимости).
  • Эта стратегия позволяет уменьшить количество перераспределений памяти и повысить производительность.

Пример 3: Использование reserve для предварительного выделения вместимости

ИспользованиеreserveМожно заранее выделить достаточную вместимость, чтобы избежать частого перераспределения памяти.

Пример

#include <iostream>
#include <vector>

int main() {
    // Предварительно выделить вместимость для 1000 элементов
    std::vector<int> v;
    v.reserve(1000);

    std::cout << "После reserve(1000) - размер: " << v.size()
              << ", ёмкость: " << v.capacity() << std::endl;

    // Добавить 100 элементов
    for(int i = 0; i < 100; ++i) {
        v.push_back(i);
    }

    std::cout << "После добавления 100 элементов - размер: " << v.size()
              << ", ёмкость: " << v.capacity() << std::endl;

    return 0;
}

Ожидаемый результат:

reserve(1000) 后 - size: 0, capacity: 1000
添加 100 个元素后 - size: 100, capacity: 1000

Анализ кода:

  • reserve(1000)Предварительно выделенное пространство памяти, которое может вместить 1000 элементов.
  • После добавления 100 элементов,capacityОна всё ещё равна 1000, и перераспределение памяти не произошло.
  • Это может значительно повысить производительность, особенно когда нужно добавить большое количество элементов.

Пример 4: shrink_to_fit освобождает избыточную ёмкость

Введено в C++11shrink_to_fitметод, который может настроить ёмкость так, чтобы она совпадала с size.

Пример

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;

    // Добавить 5 элементов
    for(int i = 0; i < 5; ++i) {
        v.push_back(i);
    }

    std::cout << "Начальное состояние - размер: " << v.size()
              << ", ёмкость: " << v.capacity() << std::endl;

    // Зарезервировать больше места
    v.reserve(100);
    std::cout << "После reserve(100) - размер: " << v.size()
              << ", ёмкость: " << v.capacity() << std::endl;

    // Уменьшить до подходящего размера
    v.shrink_to_fit();
    std::cout << "После shrink_to_fit() - размер: " << v.size()
              << ", ёмкость: " << v.capacity() << std::endl;

    return 0;
}

Ожидаемый результат:

初始状态 - size: 5, capacity: 5
reserve(100) 后 - size: 5, capacity: 100
shrink_to_fit() 后 - size: 5, capacity: 5

Анализ кода:

  • shrink_to_fit()Запрашивает у контейнера уменьшение ёмкости до значения size.
  • Это может освободить память, которая больше не нужна.
  • Примечание: это не обязательно; фактическая ёмкость зависит от реализации.

Пример 5: Практическое применение ёмкости

ИзучитьcapacityЭто может помочь оптимизировать использование памяти.

Пример

#include <iostream>
#include <vector>

void printStatus(const std::string& operation,
                 const std::vector<int>& v) {
    std::cout << operation << " - размер: " << v.size()
              << ", ёмкость: " << v.capacity() << std::endl;
}

int main() {
    std::vector<int> data;

    printStatus("Начальное состояние", data);

    // Если мы знаем, что нам нужно сохранить 1000 элементов, можно заранее выделить память
    const size_t estimatedSize = 1000;
    data.reserve(estimatedSize);

    printStatus("После reserve(1000)", data);

    // Имитируем загрузку данных
    for(size_t i = 0; i < 1000; ++i) {
        data.push_back(static_cast<int>(i));
    }

    printStatus("После добавления 1000 элементов", data);

    // Проверяем, нужно ли расширение емкости
    if(data.capacity() < estimatedSize) {
        std::cout << "Warning: Insufficient capacity!" << std::endl;
    } else {
        std::cout << "Sufficient capacity, minimized memory allocation count" << std::endl;
    }

    return 0;
}

Ожидаемый результат:

初始状态 - size: 0, capacity: 0
reserve(1000) 后 - size: 0, capacity: 1000
添加 1000 个元素后 - size: 1000, capacity: 1000
容量充足,内存分配次数最少化

Анализ кода:

  • Предварительно оцените требуемую емкость и используйтеreserveпозволяет избежать множественных выделений памяти.
  • Это особенно полезно в сценариях с большими объемами данных.

класс контейнера C++ <vector>

Другие расширения