vectorクラス

http://www.geocities.jp/ky_webid/cpp/library/002.html

配列を便利且つ簡単に扱うためのクラス。

このようなクラスのことをコンテナといいます。

今回は基本的な操作を覚えたいと思います。


初期化での要素の確保


宣言時に要素数を指定して初期化することができます。

#include <vector>
#include <iostream>
using namespace std;

int main () {
    vector<int> array(10000);
    return 0;
}

もともとvectorというのは配列のサイズを気にしなくても動的に拡張してくれるものなので基本的にはサイズを気にする必要はないと言えばないんですが、予め使用する大体のサイズがわかっているのなら初期値として指定して確保する方が、メモリの断片化(フラグメンテーション)を防ぐという意味で良いのです。


初期化以外での要素の確保


初期化で要素を確保する場合、ひとつ問題があります。基準となる型に引数なしコンストラクタ(もしくはデフォルトコンストラクタ)が定義されていない型だった場合に、初期化での要素の指定ができません。

#include <vector>
#include <iostream>
using namespace std;

class CSample {
public:
    CSample (int num) : m_num(num) {}
    int m_num;
};

int main () {
    // 引数なしコンストラクタが定義されてないのでこの初期化はエラー
    vector<CSample> array(1000);
    
    return 0;
}

こういう場合はreserve関数を使って領域を確保します。

#include <vector>
#include <iostream>
using namespace std;

class CSample {
public:
    CSample (int num) : m_num(num) {}
    int m_num;
};

int main () {
    vector<CSample> array;
    array.reserve(1000);
    
    return 0;
}

要素の追加


push_back関数を使って要素を末尾に追加します。

#include <vector>
#include <iostream>
using namespace std;

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    return 0;
}

要素へのアクセス


通常の配列と同様、[]演算子でアクセスできます。

#include <vector>
#include <iostream>
using namespace std;

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    for(int i=0;i<10;i++) {
        cout << array[i] << endl;
    }
    
    return 0;
}
$ main
0
1
2
3
4
5
6
7
8
9

ちなみにstringクラスと同様、at関数経由でもアクセスできます。

cout << array.at(i) << endl;

配列のサイズ


size関数で取れます。

#include <vector>
#include <iostream>
using namespace std;

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    cout << array.size() << endl;
    
    return 0;
}
$ main
10

stringクラスと同様、空かどうかを判定する場合はsizeではなくemptyを使ったほうが効率がいいそうです。


要素の削除


末尾から要素を削除するにはpop_backが使えます。

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    for(int i=0;i<10;i++) {
        array.pop_back();
    }
    
    return 0;
}

要素の全削除


clear関数で可能です。

#include <vector>
#include <iostream>
using namespace std;

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    array.clear();
    
    cout << array.size() << endl;
    
    return 0;
}
$ main
0

基本操作はこれくらいで。