std::string reserve() 方法
- 自 C++20 起
- 直到 C++20
// Non const version only
constexpr void reserve( size_type new_cap );
// Non const version only
void reserve();
// Non const version only
void reserve( size_type new_cap = 0);
-
(1) 通知
std::basic_string
对象计划的尺寸变更,以便它可以适当地管理存储分配。- 如果
new_cap
大于当前的capacity()
,则分配新的存储空间,并且capacity()
将等于或大于new_cap
。- 自 C++20 起
- 直到 C++20
- 如果
new_cap
小于或等于当前的capacity()
,则没有效果。
- 如果
new_cap
小于当前的capacity()
,这是一个非约束性收缩请求。 - 如果
new_cap
小于当前的size()
,这是一个非约束性收缩以适应请求 等同于shrink_to_fit()
。 (C++11 起)
- 如果
-
(2) 不带参数调用 reserve 是一个非约束性收缩以适应请求。在此调用之后,capacity() 具有未指定的值,该值大于或等于 size()。
失效
如果发生容量变化,所有迭代器和引用,包括尾后迭代器,都将失效。
参数
new_cap
- 字符串的新容量,以元素数量表示
类型要求
T
(容器的元素类型)必须满足MoveInsertable
的要求。
返回值
(无)
复杂度
最多与容器的 size()
成线性关系 - O(size())。
异常
std::length_error
如果new_cap > max_size()
- 由
Allocator::allocate()
抛出的任何异常(通常是std::bad_alloc
)
示例
Main.cpp
#include <cassert>
#include <iostream>
#include <string>
int main()
{
std::string s;
const std::string::size_type new_capacity{ 100u };
std::cout << "Before: " << s.capacity() << "\n";
s.reserve(new_capacity);
std::cout << "After: " << s.capacity() << "\n";
assert(new_capacity <= s.capacity());
// 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 << "New capacity: " << cap << '\n';
}
// s.reserve(); //< deprecated in C++20, use:
s.shrink_to_fit();
std::cout << "After: " << s.capacity() << "\n";
}
可能输出
Before: 15
After: 100
New capacity: 200
New capacity: 400
New capacity: 800
New capacity: 1600
After: 801