命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
(1)
void reserve( size_type new_cap = 0 );
(until C++20)
constexpr void reserve( size_type new_cap );
(since C++20)
void reserve();
(2) (since C++20)
(deprecated in C++20)
(removed in C++26)
1) 通知 std::basic_string 对象计划的大小更改,以便它可以适当地管理存储分配。
  • 如果 new_cap 大于当前的 capacity(),则会分配新的存储空间,并且 capacity() 将变得等于或大于 new_cap
  • 如果 new_cap 小于当前的 capacity(),这是一个非强制性的收缩请求。
  • 如果 new_cap 小于当前的 size(),这是一个非强制性的缩减到合适大小的请求 等效于 shrink_to_fit()(自 C++11 起)
(until C++20)
  • 如果 new_cap 小于或等于当前的 capacity(),则不会有任何影响。
(since C++20)
如果发生容量更改,则所有迭代器和引用(包括 past-the-end 迭代器)都将失效。
2) 非强制性的缩减到合适大小的请求。 在此调用之后,capacity() 具有大于或等于 size() 的未指定值。

目录

[edit] 参数

new_cap - 字符串的新容量

[edit] 返回值

(无)

[edit] 异常

如果 new_cap 大于 max_size(),则抛出 std::length_error

可能会抛出 std::allocator_traits<Allocator>::allocate() 抛出的任何异常,例如 std::bad_alloc

如果由于任何原因抛出异常,则此函数无效(强异常安全保证)。

[edit] 复杂度

最多与字符串的 size() 成线性关系。

[edit] 示例

#include <cassert>
#include <iostream>
#include <string>
 
int main()
{
    std::string s;
    std::cout << "1) Initially: " << s.capacity() << '\n';
 
    const std::string::size_type new_cap{101u};
    s.reserve(new_cap);
    assert(s.capacity() >= new_cap);
    std::cout << "2) After reserve(" << new_cap << "): " << s.capacity() << '\n';
 
    // observing the capacity growth factor
    auto cap{s.capacity()};
    for (int check{}; check != 4; ++check)
    {
        while (cap == s.capacity())
            s += '$';
        cap = s.capacity();
        std::cout << (3) + check << ") Capacity: " << cap << '\n';
    }
 
//  s.reserve(); // deprecated/removed in C++20/26, use:
    s.shrink_to_fit();
    std::cout << "7) After shrink_to_fit: " << s.capacity() << '\n';
}

可能的输出

1) Initially: 15
2) After reserve(101): 101
3) Capacity: 202
4) Capacity: 404
5) Capacity: 808
6) Capacity: 1616
7) After shrink_to_fit: 809

[edit] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 847 C++98 没有异常安全保证 添加了强异常安全保证

[edit] 参见

返回当前已分配存储中可以容纳的字符数
(public member function) [编辑]
更改存储的字符数
(public member function) [编辑]