iterator がある場合、実際の iterator を下vector<int>::iterator i = vector.begin()
に移動します。i++
しかし、なぜ次のような
i = i + 3
3 ドア下の新しいイテレータを提供しますか?
から期待される自然な行動を模倣すること+
。同じように:
int x = 0;
int y = x + 3;
2行目は変更x
されず、値3に評価されるだけです。ただし、x++
を変更しx
ます。
汎用イテレータを拡張する場合は、を使用する必要がありますstd::advance(i, 3)
(i += 3
ランダムアクセスイテレータで実行さi++
れ、その他の場合は3回実行されます)。
を使用する場合operator+
、どちらのオペランドも変更されることはありません。つまり、新しいオブジェクトを作成する必要があります。これを行った場合と同じように:
int a = 5;
int b = a + 3;
あなたはまだ5に等しいと期待するでしょう。
あなたが書くことができるように:
j = i + 3;
operator+
新しいコピーを作成しなかった場合、それは何をしますか?変更しi
ますか?
であろうと であろうと、が何であるかに関係なく、の値を変更してはx + n
ならないからです。考え方は同じです。x
x
int
iterator
ただし、これを書きたくない場合:
it = it + 3;
次に、別の方法があります。次のように書くことができます。
std::advance(it, 3);
ランダム アクセス イテレータ1をサポートしない一部の標準コンテナの場合、書き込みはできませんがit = it + 3
、書き込みは可能です。例えば:std::advance(it,3)
std::list<int>::iterator it = lst.begin();
it = it + 3; //COMPILATION ERROR. `it` is not random access iterator
std::advance(it,3); //okay
したがって、そのような場合、std::advance(it,3)
唯一の方法です (または、そのような機能を自分で作成する必要があります)。
1.std::vector<T>::iterator
はランダム アクセス イテレータであることに注意してくださいit+3
。