std::vector<T,Allocator>:: resize
|
void
resize
(
size_type count
)
;
|
(1) | (自 C++20 起为 constexpr) |
|
void
resize
(
size_type count,
const
value_type
&
value
)
;
|
(2) | (自 C++20 起为 constexpr) |
将容器大小调整为包含 count 个元素:
- 若 count 等于当前尺寸,则不执行任何操作。
- 若当前尺寸大于 count ,容器将缩减至其前 count 个元素。
- 若当前尺寸小于 count ,则:
目录 |
参数
| count | - | 容器的新大小 | ||
| value | - | 用于初始化新元素的值 | ||
| 类型要求 | ||||
-
|
||||
复杂度
与当前大小和 count 之间的差值呈线性关系。若容量小于 count ,可能因重新分配产生额外复杂度。
异常处理
如果因任何原因抛出异常,这些函数不会产生任何效果(
强异常安全保证
)。
虽然未明确说明,但如果新
vector
所需的容量超过
max_size()
,则会抛出
std::length_error
。
|
在重载
(
1
)
中,若
|
(C++11 起) |
注释
如果重载
(
1
)
中的值初始化不可取(例如当元素为非类类型且不需要清零时),可以通过提供
自定义的
Allocator::construct
来避免。
当调整至更小尺寸时,vector的容量永远不会减少,因为这将使所有迭代器失效,而标准规范仅要求擦除元素及其后的迭代器失效。
示例
#include <vector> #include <iostream> void print(auto rem, const std::vector<int>& c) { for (std::cout << rem; const int el : c) std::cout << el << ' '; std::cout << '\n'; } int main() { std::vector<int> c = {1, 2, 3}; print("The vector holds: ", c); c.resize(5); print("After resize up to 5: ", c); c.resize(2); print("After resize down to 2: ", c); c.resize(6, 4); print("After resize up to 6 (initializer = 4): ", c); }
输出:
The vector holds: 1 2 3 After resize up to 5: 1 2 3 0 0 After resize down to 2: 1 2 After resize up to 6 (initializer = 4): 1 2 4 4 4 4
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 679 | C++98 |
resize()
按值传递
value
|
按常量引用传递 |
| LWG 1525 | C++98 | 未指定 resize ( size ( ) ) 的行为 | 已指定 |
| LWG 2033 | C++11 |
1. 使用
erase()
[1]
移除元素
2.
T
的类型要求不正确
|
1. 使用
pop_back()
2. 已修正 |
| LWG 2066 | C++11 |
重载
(
1
)
不具备重载
(
2
)
的异常安全保证 |
已添加 |
| LWG 2160 | C++11 |
由于 LWG 2033 的解决方案
使用 pop_back() [2] 移除元素 |
未指定元素移除方式 |
-
↑
erase()
可以移除
vector中间的元素,因此要求值类型满足 MoveAssignable 要求,以便被移除段之后的元素可以向前移动填补空缺。但resize()只能移除vector末尾的元素,这使得 MoveAssignable 要求不再必要。 - ↑ 使用 pop_back() 移除元素意味着需要从后向前依次移除元素。
参见
|
返回可容纳的最大元素数
(公开成员函数) |
|
|
返回容纳的元素数
(公开成员函数) |
|
|
返回当前存储空间能够容纳的元素数
(公开成员函数) |
|
|
检查容器是否为空
(公开成员函数) |