std::basic_string<CharT,Traits,Allocator>::reserve
来自 cppreference.cn
< cpp | string | 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。
|
(C++20 前) |
|
(C++20 起) |
如果容量发生改变,所有迭代器和引用,包括末尾迭代器,都会失效。
目录 |
[编辑] 参数
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 | 没有异常安全保证 | 添加了强异常安全保证 |
[编辑] 参阅
返回当前分配存储中可容纳的字符数 (公开成员函数) | |
更改存储的字符数 (公开成员函数) |