std::basic_string<CharT,Traits,Allocator>::reserve
来自 cppreference.com
< cpp | string | 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。
|
(until C++20) |
|
(since 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++ 标准。
DR | 应用于 | 发布的行为 | 正确的行为 |
---|---|---|---|
LWG 847 | C++98 | 没有异常安全保证 | 添加了强异常安全保证 |
[编辑] 另请参阅
返回当前分配的存储中可以容纳的字符数 (公共成员函数) | |
更改存储的字符数 (公共成员函数) |