1. size() メソッドと Capacity() メソッドの違い
1. Vector には size() メソッドと Capacity() メソッドがあり、どちらも Vector のサイズを取得するために使用されますが、両者の違いは何ですか?
まずコードの一部を見てみましょう。
int main() {
std::vector<int> v1;
std::cout <<"size:"<< v1.size() << " ,capacity:" << v1.capacity() << std::endl;
v1.resize(10);
std::cout <<"size:"<< v1.size() << " ,capacity:" << v1.capacity() << std::endl;
for (int i = 0; i < 10; i++) {
std::cout << v1[i] << " ";
}
std::cout<<std::endl;
v1.push_back(1);
std::cout << "size:" << v1.size() << " ,capacity:" << v1.capacity() << std::endl;
return 0;
}
実行結果は以下の通りです。
以下の結論が得られます。
(1) Capacity() は、ベクトルの事前に割り当てられたメモリ空間を示し、ベクトルが保持できる最大要素数を示します。
(2) size() は、ベクトル内で実際に占有されている要素の数を示します。
上記では size=11、capacity=15 を確認しましたが、12 番目と 13 番目の要素を出力して結果を確認します。
std::cout << v1[11] << " " << v1[12] << std::endl;
事前に割り当てられたスペースにもアクセスできることがわかりますが、内部の値は不確かです。
次に、resize() メソッドとreserve() メソッドの違いです。
(1)size()を使用すると、コンテナ内のオブジェクトメモリ空間が実際に存在します。
上記の例では、v1.resize(10); を実行した後、size() と Capacity() の値が両方とも 10 であることがわかります。
(2)reserve() は容量の値を変更するだけであり、コンテナ内のオブジェクトには実メモリ空間がありません (空間は「ワイルド」です)。
3.clear() と swap() の違い
(1)コンテナ内の要素を解放(破棄)しただけではsize=0となりますが、コンテナの容量、つまり占有メモリは変わりません。
次のコードで確認してみましょう。
v1.clear();
std::cout << "size:" << v1.size() << " ,capacity:" << v1.capacity() << std::endl;
結果:
clear() の後、size() は 0 になりますが、capacity() の値は 15 のままであることがわかります。
(2) swap()メソッドを確認する
//v1.clear();
std::vector<int> tmp;
tmp.swap(v1);
std::cout << "size:" << v1.size() << " ,capacity:" << v1.capacity() << std::endl;
結果は次のとおりです。
縮小する必要があるコンテナは要素のない一時的なコンテナと交換され、最終的に縮小する必要があるコンテナのサイズが容量のサイズと同じになり、縮小の目的が達成されます。スコープから外れるとリソースが解放されます。
さらに、shrink_to_fit() メソッドを使用してベクトルのメモリを解放できるようになりました。
v1.clear();
//std::vector<int> tmp;
//tmp.swap(v1);
v1.shrink_to_fit();
std::cout << "size:" << v1.size() << " ,capacity:" << v1.capacity() << std::endl;
参考:
(1) C++ STLにおけるvectorのcapacity属性とsize属性の違い
(2) C++のvectorのclear()、swap()、shrink_to_fit()メソッド
(3)