イテレータで複数分先に進める(or戻る)方法

通常イテレータでは++演算子を用いて一つ進めたりすることができます。

vector<int>::iterator it = data.begin();
// ひとつ進める
++it;

では二つ以上進めたい場合どうするか?

// 二つ進める
++it;
++it;

とすればできますよね、当たり前の話です。でもこれが5つ進めたいとしたら?あるいは100進めたいとしたら?++演算子だけではちょっと面倒です。

そこで+=演算子が使えるのではないかと試してみました。

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

int main () {
    vector<int> data;
    
    for(int i=0;i<100;++i) {
        data.push_back(i);
    }
    
    vector<int>::iterator it = data.begin();
    
    // 5つ進める
    it+=5;
    
    cout << *it << endl;
    
    return 0;
}
$ main
5

ビンゴですね。

またiteratorヘッダに用意されているadvance関数を使ってイテレータを進めることもできます。

// 5つ進める
advance(it,5);

たぶんですが、+=演算子オーバーロードした後の処理はadvance関数に任せてるんじゃないかなぁと想像してます。