STL - Vector

C, Java -> C# -> Web系 -> Objective-Cという順で触ってきたので、 実はC++をほとんどやったことが無い。 今回OpenGLを触ることになったので、その周辺でC++を触ってみることにしてみた。

そんな感じだから、STLってよく聞くけど触ったことないわーというレベルなので、 メモリ管理だとか、size()とcapacity()の違いとか、resize()とreserve()の違いとかでちょっと混乱したので、まとめてみる。

size()とresize()が要素数。 capacity()とreserve()が許容量。 Vectorは動的配列なので、考え方も静的配列とそんなに変わりない。

例えば静的配列で、

int array[10];
int counter = 0;
for(int i = 0; i < 5; i++){
	array[i] = i;
	counter++;
}

という内容のプログラムがあったとすると、capacityは10、sizeは5。 arrayをreallocするのがreserve()で、counterの値を変更するのがresize() ということになる。

当初reallocのつもりでresizeして困惑した。 ちゃんと調べないとダメだな。

resize()とreserve()の引数で現在の値よりも小さい値を指定した場合、 要素数は変わるもののreserve()は無視されて許容量は変わらないらしい。 つまりメモリの解放には使えないということになる。

vectorの方が配列よりも便利なのは、 push_back(const Type& value); すれば、許容量オーバーした場合でも自動的に拡張してくれること。 これは便利だね。 ちょっと気になるのはメモリがちゃんと連続して確保されているのかってことだけど、 このページによると連続していることが保証されているらしい。 ならもう静的な配列を使うこたぁねぇなぁ。 すばらしい。

Written on May 31, 2011