std::basic_string<CharT,Traits,Allocator>::reserve
Материал из cppreference.com
< cpp | string | basic string
(1) | ||
void reserve( size_type new_cap =0); | (до C++20) | |
constexprvoid 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 функция-элемент) |