2

次のようなネストされたイテレータがあっても大丈夫ですか?

for (vector<type>::iterator i = list.begin(); i != list.end(); ++i) {
    for (vector<type>::iterator j = i; j != list.end(); ++j) {
        ...
    }
}

jで始まりi、ではないことに注意してくださいlist.begin()。イテレータはランダムアクセスであるため、両方ijが同じ順序になることを保証できますか?これを行うためのより良い方法はありますか?

4

4 に答える 4

4

あなたのコードは正しいです。

両方のイテレータの順序は同じであり、イテレータを無効にする操作(たとえば、ベクトルからの消去やベクトルへのプッシュ)を行わない限り、インクリメントjは影響しません。i

于 2013-02-17T18:39:28.023 に答える
3

イテレータを無効にする可能性のあるループで何もしない限り、これは絶対に問題ありません。

(余談ですが、私の意見でlistはaの名前は疑わしいです。)std::vector

于 2013-02-17T18:39:29.357 に答える
3

それはまったく問題ありません。ランダムアクセスはランダムな順序を意味するものではありません。これは、イテレータで加法演算子(+および)を使用してコンテナをジャンプできることを意味します。-たとえば、ランダムアクセスイテレータitを使用すると、次のことができますit + 10。非ランダムアクセスイテレータの場合it++、同じ効果を得るには10回実行する必要があります。(ただし、std::advance関数はこれをカプセル化します)

于 2013-02-17T18:40:18.330 に答える
1

これは正常に機能するはずです。ベクターは要素を順番に格納し、両方のイテレータはこの順序に従います。

于 2013-02-17T18:40:54.580 に答える