cpp/string/basic string/reserve — различия между версиями
Материал из cppreference.com
< cpp | string | basic string
Stormherz (обсуждение | вклад) |
Olya (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | {{cpp/string/basic_string/title | reserve}} | + | {{cpp/string/basic_string/title|reserve}} |
{{cpp/string/basic_string/navbar}} | {{cpp/string/basic_string/navbar}} | ||
− | {{ | + | {{ |
− | void reserve( size_type | + | |
+ | |||
+ | |||
+ | | | ||
+ | void reserve( size_type ); | ||
}} | }} | ||
+ | |||
+ | |||
+ | |||
+ | |||
− | + | {{tt|}} . | |
+ | выделяется | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | . | ||
===Параметры=== | ===Параметры=== | ||
{{par begin}} | {{par begin}} | ||
− | {{par | | + | {{par||новая строки}} |
{{par end}} | {{par end}} | ||
===Возвращаемое значение=== | ===Возвращаемое значение=== | ||
− | ( | + | () |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
===Сложность=== | ===Сложность=== | ||
− | линейная по | + | линейная по строки |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
− | === | + | ===также=== |
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/string/basic_string/dsc capacity}} | + | {{dsc inc|cpp/string/basic_string/dsc capacity |
+ | }} | ||
{{dsc end}} | {{dsc end}} | ||
− | + | deenesfritjaptzh | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Текущая версия на 05:05, 20 октября 2023
(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 функция-элемент) |