Пространства имён
Варианты
Действия

std::basic_string<CharT,Traits,Allocator>::reserve

Материал из cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
Функции-элементы
Доступ к элементам
Итераторы
Ёмкость
basic_string::reserve
Операции
Поиск
Константы
Правила вывода (C++17)
Функции, не являющиеся элементами
Ввод/Вывод
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
(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.
  • Если new_cap меньше текущего значения capacity(), это необязательный запрос на сжатие.
  • Если new_cap меньше текущего size(), это необязательный запрос на сжатие эквивалентный shrink_to_fit() (начиная с C++11).
(до C++20)
  • Если new_cap меньше или равно текущему capacity(), эффекта нет.
(начиная с 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 847C++98не было гарантии безопасности исключенийдобавлена надёжная гарантия безопасности исключений

[править] Смотрите также

возвращает количество символов, которые могут храниться в выделенной в данный момент памяти
(public функция-элемент) [править]
изменяет количество сохранённых символов
(public функция-элемент) [править]