ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

STL vector その2

vectorは要素を追加するときにメモリ領域が足りなかったら自動的に拡張してくれる。
メモリ拡張せずにあと、どのくらい要素を追加できるのかを得る関数がcapacity()。この値よりも要素を追加しようとするとメモリ領域の拡張が行われる。
実際に要素を20個追加したときのcapacity()の値を表示してみたのが次のプログラム。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;

    for(int i=0; i<20; i++)
    {
        v.push_back(i);
        cout << v.capacity() << " ";
    }
    cout << endl;

    // すべて削除
    v.clear();

    cout << v.capacity() << endl;
}

実行結果は次のとおり。

1 2 3 4 6 6 9 9 9 13 13 13 13 19 19 19 19 19 19 28
28

4個追加するまでは1個ずつメモリを拡張しているが、それ以降ではもっと大きく拡張されている。値の変化を見てると、前に確保されていた領域の半分だけ増加されているようだ。
要素を削除しても、capacity()の値は変わらない。つまりメモリ確保したままということ。使わなくなったvectorをそのままにしておくのはメモリの無駄。
もし、追加される要素数がある程度わかっているのなら、reserve()であらかじめメモリ領域を確保しておくことができる。メモリ拡張の処理が省けるので効率が良くなる。

v.reserve(100);

これで要素100個分の領域が確保される。もしすでに100個以上要素が追加されていた場合には何もしない。