2012/6/21追記:faith_and_brave様からコメントを頂きました。C++11からは、swap技法と同じことがshrink_to_fit()というメンバ関数でできるそうです。貼っていただいたURLもぜひ御覧ください。コメントありがとうございました。
Effective STLで知ったネタ。STLのvectorに要素をpushし続けたあと、不要な要素を消すためにresize()しても、確保済みの領域は確保されたままになってしまう。そこでswap技法(英語だとswap trick)を用いると、確保済みの領域を削除できるらしい。
#include <iostream> #include <vector> using namespace std; int main(){ vector<int> vec; for(int i = 0; i < 100; i++){ vec.push_back(i); } cout << "vec's size = " << vec.size() << endl; cout << "vec's capacity = " << vec.capacity() << endl; vec.resize(10); cout << "vec's size = " << vec.size() << endl; cout << "vec's capacity = " << vec.capacity() << endl; // swap trick vector<int>(vec).swap(vec); cout << "vec's size = " << vec.size() << endl; cout << "vec's capacity = " << vec.capacity() << endl; return 0; }
出力は以下。
vec's size = 100 vec's capacity = 128 vec's size = 10 vec's capacity = 128 vec's size = 10 vec's capacity = 10