3

iterator がある場合、実際の iterator を下vector<int>::iterator i = vector.begin()に移動します。i++しかし、なぜ次のような

i = i + 3

3 ドア下の新しいイテレータを提供しますか?

4

4 に答える 4

5

から期待される自然な行動を模倣すること+。同じように:

int x = 0;
int y = x + 3;

2行目は変更xされず、値3に評価されるだけです。ただし、x++ 変更しxます。

汎用イテレータを拡張する場合は、を使用する必要がありますstd::advance(i, 3)i += 3ランダムアクセスイテレータで実行さi++れ、その他の場合は3回実行されます)。

于 2012-12-08T18:46:32.830 に答える
4

を使用する場合operator+、どちらのオペランドも変更されることはありません。つまり、新しいオブジェクトを作成する必要があります。これを行った場合と同じように:

int a = 5;
int b = a + 3;

あなたはまだ5に等しいと期待するでしょう。

于 2012-12-08T18:47:04.013 に答える
1

あなたが書くことができるように:

j = i + 3;

operator+新しいコピーを作成しなかった場合、それは何しますか?変更しiますか?

于 2012-12-08T18:46:57.990 に答える
1

であろうと であろうと、が何であるかに関係なく、の値を変更しては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

于 2012-12-08T18:59:44.760 に答える