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ならないからです。考え方は同じです。xxintiterator
ただし、これを書きたくない場合:
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。