std::vector<T,Allocator>:: resize
|
void
resize
(
size_type count
)
;
|
(1) | (constexpr since C++20) |
|
void
resize
(
size_type count,
const
value_type
&
value
)
;
|
(2) | (constexpr since C++20) |
コンテナを count 個の要素を含むようにサイズ変更します:
- count が現在のサイズと等しい場合、何も行いません。
- 現在のサイズが count より大きい場合、コンテナは最初の count 要素に縮小されます。
- 現在のサイズが count より小さい場合、以下の処理が行われます:
目次 |
パラメータ
| count | - | コンテナの新しいサイズ | ||
| value | - | 新しい要素を初期化するための値 | ||
| 型要件 | ||||
-
|
||||
計算量
現在のサイズと count の差に対して線形。容量が count より小さい場合、再割り当てによる追加の複雑さが生じる可能性があります。
例外
何らかの理由で例外がスローされた場合、これらの関数は何の効果も持ちません(
強い例外安全保証
)。
明示的に規定されていませんが、新しい
vector
に必要な容量が
max_size()
を超える場合、
std::length_error
がスローされます。
|
オーバーロード
(
1
)
において、
|
(C++11以降) |
注記
オーバーロード
(
1
)
における値初期化が望ましくない場合、例えば要素が非クラス型でありゼロ初期化が不要な場合、
カスタム
Allocator::construct
を提供することで回避できます。
より小さいサイズへのリサイズ時にベクターの容量が減少することはありません。これはすべてのイテレータを無効化するためであり、仕様では消去された要素以降のイテレータのみが無効化されるためです。
例
#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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| 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 | LWG 2033の解決により、要素の削除に pop_back() [2] を使用していた | 要素の削除方法を規定しない |
-
↑
erase()
は
vectorの中間の要素を削除できるため、削除された部分に続く要素が隙間を埋めるために前方に移動できるように、値型は MoveAssignable である必要があります。しかし、resize()はvectorの末尾の要素のみを削除するため、 MoveAssignable は不要です。 - ↑ pop_back() を使用して要素を削除する場合、要素は末尾から先頭に向かって削除される必要があることを意味します。
関連項目
|
要素の最大可能数を返す
(public member function) |
|
|
要素数を返す
(public member function) |
|
|
現在割り当てられたストレージに格納可能な要素数を返す
(public member function) |
|
|
コンテナが空かどうかをチェックする
(public member function) |