РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
214 of 815 menu

Метод 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,
    который уменьшает ёмкость до размера вектора
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить