すぐに忘れるのでメモ.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() であらかじめ容量を確保するようなコードを書く機会があまりないので,記憶があやふやで,実際にテストコードを書いてみないと不安になります.