Namespaces
Variants

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

From cppreference.net

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 より小さい場合、以下の処理が行われます:
1) 追加の T ( ) のコピー (C++11まで) デフォルト挿入された 要素 (C++11以降) が追加されます。
2) 追加の value のコピーが追加されます。

目次

パラメータ

count - コンテナの新しいサイズ
value - 新しい要素を初期化するための値
型要件
-

以下の条件が満たされる場合、動作は未定義です:

1) T DefaultInsertable または MoveInsertable ではない場合
2) T CopyInsertable ではない場合
(C++11以降)

計算量

現在のサイズと count の差に対して線形。容量が count より小さい場合、再割り当てによる追加の複雑さが生じる可能性があります。

例外

何らかの理由で例外がスローされた場合、これらの関数は何の効果も持ちません( 強い例外安全保証 )。 明示的に規定されていませんが、新しい vector に必要な容量が max_size() を超える場合、 std::length_error がスローされます。

オーバーロード ( 1 ) において、 T のムーブコンストラクタが noexcept ではなく、かつTが CopyInsertable でない場合、 * this 内で vector は例外を投げる可能性のあるムーブコンストラクタを使用する。例外が発生した場合、保証は放棄され、効果は未定義となる。

(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] を使用していた 要素の削除方法を規定しない
  1. erase() vector の中間の要素を削除できるため、削除された部分に続く要素が隙間を埋めるために前方に移動できるように、値型は MoveAssignable である必要があります。しかし、 resize() vector の末尾の要素のみを削除するため、 MoveAssignable は不要です。
  2. pop_back() を使用して要素を削除する場合、要素は末尾から先頭に向かって削除される必要があることを意味します。

関連項目

要素の最大可能数を返す
(public member function)
要素数を返す
(public member function)
現在割り当てられたストレージに格納可能な要素数を返す
(public member function)
コンテナが空かどうかをチェックする
(public member function)