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

来自cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
basic_string::reserve
操作
搜索
常量
推导指引 (C++17)
非成员函数
I/O
比较
(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)请求,等价于 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;
    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 没有异常安全保证 添加强异常安全保证

参阅

返回当前对象分配的存储空间能保存的字符数量
(公开成员函数)