std::basic_string<CharT,Traits,Allocator>::reserve
Материал из cppreference.com
< cpp | string | basic string
(1) | ||
void reserve( size_type new_cap = 0 ); | (до C++20) | |
constexpr void reserve( size_type new_cap ); | (начиная с C++20) | |
void reserve(); | (2) | (начиная с C++20) (устарело) |
1) Информирует объект
std::basic_string
о запланированном изменении размера, чтобы он мог соответствующим образом управлять распределением памяти.- Если new_cap больше текущего значения capacity(), выделяется новое хранилище, а capacity() становится равным или большим, чем new_cap.
| (до C++20) |
| (начиная с C++20) |
Если происходит изменение ёмкости, все итераторы и ссылки, включая итератор вставки в конец, становятся недействительными.
2) Необязательный запрос на усадку по размеру. После этого вызова capacity() имеет неопределённое значение, большее или равное size().
Содержание |
[править] Параметры
new_cap | — | новая ёмкость строки |
[править] Возвращаемое значение
(нет)
[править] Исключения
Генерирует std::length_error, если new_cap больше, чем max_size().
Может генерировать любые исключения, создаваемые std::allocator_traits<Allocator>::allocate(), например std::bad_alloc.
Если по какой-либо причине генерируется исключение, эта функция не имеет эффекта (строгая гарантия безопасности исключений).
[править] Сложность
Максимально линейная по size() строки.
[править] Пример
Запустить этот код
#include <cassert> #include <iostream> #include <string> int main() { std::string s; const std::string::size_type new_capacity{100u}; std::cout << "Перед: " << s.capacity() << '\n'; s.reserve(new_capacity); std::cout << "После: " << s.capacity() << '\n'; assert(new_capacity <= s.capacity()); // наблюдение коэффициента роста ёмкости auto cap{s.capacity()}; for (int check{}; check != 4; ++check) { while (cap == s.capacity()) s += '$'; cap = s.capacity(); std::cout << "Новая ёмкость: " << cap << '\n'; } // s.reserve(); // не рекомендуется в C++20, используйте: s.shrink_to_fit(); std::cout << "После: " << s.capacity() << '\n'; }
Возможный вывод:
Перед: 15 После: 100 Новая ёмкость: 200 Новая ёмкость: 400 Новая ёмкость: 800 Новая ёмкость: 1600 После: 801
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 847 | C++98 | не было гарантии безопасности исключений | добавлена надёжная гарантия безопасности исключений |
[править] Смотрите также
возвращает количество символов, которые могут храниться в выделенной в данный момент памяти (public функция-элемент) | |
изменяет количество сохранённых символов (public функция-элемент) |