std::vector<T>の要素数について
C++で可変長の配列とかリストを使いたいときに、まず候補として**std::vector<T>**があると思います。
配列のように要素が連続して配置されることが保証されているため、最初に確保されている領域を超える要素を追加すると保持している要素の再配置を行います。
そのため予め領域を確保しておくことで、再配置が行われず効率がよくなります。
領域を確保する方法として調べてみると、
- コンストラクタでサイズを指定する
- reserve()でサイズを指定する
がありましたが、どっちを使えばいいか忘れそうだったのでメモを残しておこうと思います。
内部で保持している要素数は、size()
確保されている領域サイズは、capacity()
で確認することができます。
##1 コンストラクタでサイズを指定する
コンストラクタにサイズを指定した場合は、領域を確保するだけでなく要素も生成します。
初期値は、0やnullptrになっていました。
クラスの場合は、引数なしのコンストラクタで初期化された要素が生成されます。
std::vector<int> intVector(100);
// size == 100
int size = intVector.size();
// capacity == 100
int capacity = intVector.capacity();
// value == 0
int value = intVector[10];
##2 reserve()でサイズを指定する
reserve()で領域サイズを指定した場合は、内部的にメモリは確保しているようですが、要素は挿入されていない状態でした。
std::vector<int> intVector;
intVector.reserve(100)
// size == 0
int size = intVector.size();
// capacity == 100
int capacity = intVector.capacity();
まとめ
コンストラクタでサイズを指定すると要素の生成までするのに対して、reserve()では領域のみ確保し要素数は0となりました。
自分が使用するときは、push_back()、emplace_back()で要素を追加することばかりなのでreserve()を使うべきだと分かりました。