swap技法

Effective STL 第17項
余分な容量を取り除くには「swap技法」を使おう


まずはこのソース。
vectorのサイズを100として、サイズと容量を確認。
次に最初の要素から50番目の要素を削除して、再度サイズと容量を確認する。

vector<int> v(100);

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

cout << "最初から50番目の要素までさくーじょ" << endl;
v.erase( v.begin() , v.begin() + 50 );
cout << v.size() << endl;
cout << v.capacity() << endl;


出力

100
100
最初から50番目の要素までさくーじょ
50
100


eraseしても容量は変わらないのだ。。。
罠くせぇ。
この無駄をどうにかしたいのぜ。
シュリンクツーフィットと呼ぶらしい)
容量を事前に割り当てるreserveならなんとかしてくれるかもしれない。

vector<int> v(100);
v.reserve(50);
cout << v.size() << endl;
cout << v.capacity() << endl;


出力

100
100

残念でした。reserveはコンテナの容量が引数より小さい場合にのみ、
容量を引数より大きくするもん。


んじゃーどうするの。ここでスワップ技法。

vector<int> v(100);
v.erase(v.begin() , v.begin() + 50 );

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

cout << "swap技法" << endl;
vector<int>(v).swap(v);
cout << v.size() << endl;
cout << v.capacity() << endl;


出力

50
100
swap技法
50
50


きめぇ。
vectorのコピーコンストラクタは、
コピー対象の要素に必要なメモリ容量だけを確保するため、これを利用する。
まずはコピーコンストラクタにて一時オブジェクトを作成し、
その一時オブジェクトと現在利用しているオブジェクトをswapで交換するのだ。


・・・きめぇ!