reserve と resize

すぐに忘れるのでメモ.std::vector には reserve() メソッドと resize() が存在しますが,これらのメソッドと size() の関連があやふやだったのでテストをしてみました.

#include <vector>
#include <iostream>

int main(int argc, char* argv[]) {
    // TEST 1: コンストラクタでサイズを指定した場合.
    std::vector<int> v1(512);
    std::cout << "TEST 1: size: " << v1.size() <<", capacity: " << v1.capacity() << std::endl;

    // TEST 2: デフォルトコンストラクタで初期化した直後.
    std::vector<int> v2;
    std::cout << "TEST 2: size: " << v2.size() <<", capacity: " << v2.capacity() << std::endl;

    // TEST 3: reserve() メソッドの実行(変更前よりも大きいサイズを指定).
    v2.reserve(256);
    std::cout << "TEST 3: size: " << v2.size() <<", capacity: " << v2.capacity() << std::endl;

    // TEST 4: resize() メソッドの実行(変更前よりも大きいサイズを指定).
    v2.resize(512);
    std::cout << "TEST 4: size: " << v2.size() <<", capacity: " << v2.capacity() << std::endl;

    // TEST 5: reserve() メソッドの実行(変更前よりも小さいサイズを指定).
    v2.reserve(256);
    std::cout << "TEST 5: size: " << v2.size() <<", capacity: " << v2.capacity() << std::endl;
	
    // TEST 6: resize() メソッドの実行(変更前よりも小さいサイズを指定).
    v2.resize(128);
    std::cout << "TEST 6: size: " << v2.size() <<", capacity: " << v2.capacity() << std::endl;

    return 0;
}
実行結果
TEST 1: size: 512, capacity: 512
TEST 2: size: 0, capacity: 0
TEST 3: size: 0, capacity: 256
TEST 4: size: 512, capacity: 512
TEST 5: size: 512, capacity: 512
TEST 6: size: 128, capacity: 512

分かったのは以下の通り.

  • reserve() は,格納できる領域を確保するだけ(reserve() 実行前後で size() の値は変わらない).
  • resize() は,指定した数だけ実際に何らかの値(第 2 引数で指定可能)で埋める(resize() 実行後,size() の値は resize() で指定した値になる).resize() 前にデータが残っていた場合,それらは破棄される.
  • reserve(), resize() ともに,指定した値が capacity() よりも小さいときはそのまま(capacity() の値は小さくならない).
  • サイズを指定するコンストラクタは,resize() と同じ挙動をする.

普段,reserve() や resize() であらかじめ容量を確保するようなコードを書く機会があまりないので,記憶があやふやで,実際にテストコードを書いてみないと不安になります.