Метод reserve
Метод reserve класса vector резервирует
память для хранения заданного количества элементов.
При этом размер вектора (size) не изменяется - метод
лишь увеличивает ёмкость (capacity) контейнера, чтобы
избежать повторных перевыделений памяти при добавлении
элементов. В единственный параметр мы передаем желаемое
количество элементов, для которых нужно зарезервировать
память. Если переданное значение меньше текущей ёмкости,
то метод ничего не делает.
Синтаксис
vec.reserve(count)
Пример
Давайте создадим пустой вектор и зарезервируем
память для 5 элементов, а затем выведем
его размер и ёмкость:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
vec.reserve(5);
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
return 0;
}
Результат выполнения кода:
"size: 0"
"capacity: 5"
Как видите, размер вектора остался равным 0,
но ёмкость увеличилась до 5.
Пример
Давайте зарезервируем память для 5 элементов,
а затем добавим 3 элемента и проверим, что
перевыделения памяти не произойдет:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
vec.reserve(5);
int* ptr = vec.data();
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
cout << "same memory: " << (ptr == vec.data()) << endl;
for (int el : vec) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
"size: 3"
"capacity: 5"
"same memory: 1"
1 2 3
Значение 1 в выводе same memory означает,
что адрес памяти не изменился - перевыделения не было.
Пример
Давайте проверим, что происходит, когда мы передаем
в reserve значение меньше текущей ёмкости:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
vec.reserve(10);
cout << "capacity before: " << vec.capacity() << endl;
vec.reserve(3);
cout << "capacity after: " << vec.capacity() << endl;
return 0;
}
Результат выполнения кода:
"capacity before: 10"
"capacity after: 10"
Ёмкость не уменьшилась, так как reserve
никогда не уменьшает выделенную память.
Смотрите также
-
метод
capacity,
который возвращает текущую ёмкость вектора -
метод
size,
который возвращает количество элементов вектора -
метод
resize,
который изменяет размер вектора -
метод
shrink_to_fit,
который уменьшает ёмкость до размера вектора