2009-08-24 6 views
7

連想コンテナの場合、++オペレータはコレクションの最後を過ぎてイテレータを送信できますか?STLマップイテレータは、インクリメントによって範囲外に移動できますか?

例:これの終わりに

map<UINT32, UINT32> new_map; 
new_map[0] = 0; 
new_map[1] = 1; 

map<UINT32, UINT32> new_iter = new_map.begin(); 

++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 

、new_iter == new_map.endは()、またはそれは素晴らしい不明で終わるんでしょうか?

注:私はこれがうんざりしていることを知っていますし、物事を行う方法ではありません。私はいくつかのWTF企業コードを取り組んでいます。

+1

これをコンパイルして、最後にnew_map.end()かどうかを確認しましたか?あなたがよく分からない場合は、このような質問に答える最も簡単な方法でしょう。 – Goz

+9

@Goz:いいえ、それはちょうど1つの実装がやっていることに答えるでしょう。 – sbi

+3

[STLコンテナのイテレータと等しいイテレータをインクリメントするとどうなりますか?](https://stackoverflow.com/questions/1057724/what-happens-if-you-increment-an-iterator - it-is-the-end-iterator-of-a) – Raedwald

答えて

26

終了イテレータをインクリメントすると、結果は未定義の動作になります。だから、それは終わりのままになるか、最後から外れるか、あなたの祖母にgoatseへのリンクをメールしてください。

も参照してください:What if I increment an iterator by 2 when it points onto the last element of a vector?

+5

あなたはNasty Nasal Demonsを忘れました。 ':)' – sbi

11

前方イテレータのための++演算子の前提条件は、イテレータがdereferenceableであるということです。これはマップの最後を過ぎることができないことを意味するので、コードは未定義の動作をします。これは、C++標準のセクション24.1.3で説明されています。

+0

24.2.3実際には入力イテレータの場合は24.2.4、出力の場合は24.2.4です。 – Ruslan

5

他の人が指摘しているように、終了イテレータをインクリメントすると未定義の動作が発生しますが、これを実行すると、Visual Studio 2008が実行時にデバッグアサーションをスローすることには注意してください(checked iterators)。

関連する問題