swap技法


このエントリーをはてなブックマークに追加

2012/6/21追記:faith_and_brave様からコメントを頂きました。C++11からは、swap技法と同じことがshrink_to_fit()というメンバ関数でできるそうです。貼っていただいたURLもぜひ御覧ください。コメントありがとうございました。

Effective STLで知ったネタ。STLvectorに要素を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
  • 参考