C++ <vector> функция capacity
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 <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
Анализ кода:
- пустого вектора
capacity()равен 0. - Вектор с 5 элементами
capacity()Не менее 5 (может быть больше, в зависимости от реализации).
Пример 2: связь между размером и вместимостью
ПониманиеsizeиcapacityЭта разница — основа оптимизации использования вектора.
Пример
#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 <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 <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 <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позволяет избежать множественных выделений памяти. - Это особенно полезно в сценариях с большими объемами данных.
Другие расширения