3

STL に関する多くのテキスト (例: http://www.cplusplus.com/reference/std/iterator/ ) を目にします。これは、Forward イテレーター (および拡張により Bidi および Random イテレーター) が入力イテレーター要件と出力イテレーター要件の両方を満たさなければならないことを暗示しています。constイテレータは明らかにイテレータですが、明らかに出力イテレータではないため、これは奇妙に思えます。

この理解の真実は何ですか?出力イテレータの概念を理解していませんか、それとも出力イテレータはイテレータの拡張要件順序に該当しませんか? (このアイデアにはより良い/正式な名前がありますか? 私は、ランダム イテレータはフォワードでもある Bidi イテレータでもあるという考えを意味します...)

4

2 に答える 2

8

C++03 は言う (24.1/4):

そのカテゴリに加えて、前方、双方向、またはランダムアクセス反復子も、式 *i の結果が参照として動作するか、定数への参照として動作するかによって、変更可能または定数になります。定数反復子は、出力反復子の要件を満たしていません。式 *i (定数反復子 i の場合) の結果は、左辺値が必要な式では使用できません。

cplusplus.com はそれについて言及しないことにしました。標準の文言は、「前方反復子は入力反復子と出力反復子のすべての要件を満たしている」と述べており、次の段落で一部の前方反復子が出力反復子の要件を満たしていないと述べていることと矛盾しているため、混乱を招きます。

C++11 は少し単純化します (24.2.1/3-4):

前方反復子は、入力反復子のすべての要件を満たし、入力反復子が指定されている場合はいつでも使用できます。双方向反復子は、前方反復子のすべての要件も満たし、前方反復子が指定されている場合はいつでも使用できます。ランダム アクセス反復子は、双方向反復子のすべての要件も満たし、双方向反復子が指定されている場合はいつでも使用できます。

出力反復子の要件をさらに満たす反復子は、可変反復子と呼ばれます。変更不可能な反復子は、定数反復子と呼ばれます。

于 2012-11-07T09:32:45.390 に答える
0

はいといいえ。イテレータに適用される別の条件があります: シーケンスの変更を許可するかどうかです。この修飾は、前方、双方向などに直交します。形式的には、変化しない前方反復子は、変化しない出力反復子でもある必要があります。もちろん、変化しない出力イテレータはあまり意味がありません。出力イテレータから変化する演算子を削除すると、ほとんど残りませんが、この方法でイテレータを指定して記述する方が簡単です。変異/非変異を直交特性として扱います。

于 2012-11-07T09:35:58.727 に答える