名稱空間
變體
操作

std::vector<T,Allocator>::resize

來自 cppreference.com
< cpp‎ | 容器‎ | vector
 
 
 
 
void resize( size_type count );
(1) (C++20 起為 constexpr)
void resize( size_type count, const value_type& value );
(2) (C++20 起為 constexpr)

將容器的大小調整為包含 count 個元素,如果 count == size(),則不執行任何操作。

如果當前大小大於 count,則容器將被縮小至其前 count 個元素。

如果當前大小小於 count,則

1) 將追加額外的 預設插入 元素。
2) 將追加 value 的額外副本。

目錄

[編輯] 引數

count - 容器的新大小
value - 用於初始化新元素的值
型別要求
-
為使用過載 (1),T 必須滿足 MoveInsertableDefaultInsertable 的要求。
-
為了使用過載 (2),T 必須滿足 CopyInsertable 的要求。

[編輯] 複雜度

與當前大小和 count 之間的差值成線性關係。如果容量小於 count,則可能由於重新分配而增加額外的複雜性。

異常

如果由於任何原因丟擲異常,這些函式將不產生任何效果(強異常安全保證)。儘管未明確指定,但如果新 vector 所需的容量超出 max_size(),則會丟擲 std::length_error

在過載 (1) 中,如果 T 的移動建構函式不是 noexcept 且 T 不能 CopyInsertable*this 中,則 vector 將使用丟擲移動建構函式。如果它丟擲,則保證失效,效果未指定。

(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 按 const 引用傳遞
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 元素透過 pop_back() 移除[2]
由於 LWG 2033 的決議
未指定移除元素的方法
移除元素的方法
  1. erase() 可以移除 vector 中間的元素,因此值型別需要是 MoveAssignable,以便將移除部分後面的元素向前移動以填補空白。然而,resize() 只能移除 vector 末尾的元素,使得 MoveAssignable 不必要。
  2. 透過 pop_back() 移除元素意味著元素需要從後向前移除。

[編輯] 另請參閱

返回元素的最大可能數量
(公共成員函式) [編輯]
返回元素數量
(公共成員函式) [編輯]
返回當前已分配儲存空間中可容納的元素數量
(公共成員函式) [編輯]
檢查容器是否為空
(公共成員函式) [編輯]