命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | string‎ | basic_string
 
 
 
std::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 起)
(C++20 中已弃用)
(C++26 中移除)
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 - 字符串的新容量

[编辑] 返回值

(无)

[编辑] 异常

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

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

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

[编辑] 复杂度

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

[编辑] 示例

#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

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 847 C++98 没有异常安全保证 添加了强异常安全保证

[编辑] 参阅

返回当前分配存储中可容纳的字符数
(公开成员函数) [编辑]
更改存储的字符数
(公开成员函数) [编辑]