vectorクラスのイテレータ

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

vectorクラスにはイテレータという機能があります。

今回はそれについて学びたいと思います。


要素の取得


以下の処理で要素の取得ができます。

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

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    vector<int>::iterator it = array.begin();
    
    while( it != array.end() ) {
        cout << *it << endl;
        ++it;
    }
    
    return 0;
}
$ main
0
1
2
3
4
5
6
7
8
9

beginで開始ポインタを取得し、endポインタまでwhileで進んでいくという感じですね。

ただitはiteratorクラスであり、ポインタ変数のように見えますが実は*演算子オーバーロードなので注意が必要です。

例えばイテレータ変数itが指している要素のアドレスを得ようとして以下のように書いたとします。

vector<int> it = array.begin();
++it; // 一個進める
int* p = it;

これはit変数はクラスなので一個進めるという処理もポインタのアドレスが進んでいるわけではなく、単なる++演算子オーバーロードでありit自体のポインタは動いていないのでそのポインタを得たところで要素のポインタにはなりません。

なので要素のポインタを得るなら下記のように書く必要があります。

vector<int> it = array.begin();
++it;
int* p = &*it;

要素の削除


erase関数を使えばイテレータが現在指している要素の削除を行えます。

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

int main () {
    vector<int> array;
    
    for(int i=0;i<10;i++) {
        array.push_back(i);
    }
    
    vector<int>::iterator it = array.begin();
    
    ++it;
    
    // 二番目の要素を削除
    it = array.erase(it);
    
    it = array.begin();
    while( it != array.end() ) {
        cout << *it << endl;
        ++it;
    }
    
    return 0;
}
$ main
0
2
3
4
5
6
7
8
9

1が消えてますね。


要素の追加


insert関数を使えばイテレータが現在指している要素の後ろに新しく要素を追加できます。

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

int main () {
    vector<int> array;
    
    for(int i=0;i<5;i++) {
        array.push_back(i);
    }
    
    vector<int>::iterator it = array.begin();
    
    ++it;
    
    // 二番目後ろに要素を追加
    array.insert(it,200);
    
    it = array.begin();
    while( it != array.end() ) {
        cout << *it << endl;
        ++it;
    }
    
    return 0;
}
$ main
0
200
1
2
3
4

うまく追加できてますね。