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で交換するのだ。
・・・きめぇ!