2012-01-15 14 views
12

入力イテレータと読み取り専用フォワードイテレータの違いは何ですか?入力イテレータと読み取り専用フォワードイテレータの違いは何ですか?

後者は読み取り専用なので、明らかに出力イテレータの要件を満たしていません。そのため、(もしあれば)追加の保証を伴うイテレータを効果的に入力します。問題は、どのような追加の保証ですか?

私が推測しているのは、順方向イテレータはマルチパスであり、入力イテレータはそうでないと思いますか?

答えて

20

はい、入力イテレータは1パスイテレータです。フォワードイテレータはマルチパスですが、一度しか反復することはできません。 §24.2.3 [input.iterators] p2 (the table)から

++rの、事前/事後条件カラム:

プレ:rはdereferenceableあります。
ポスト:rは逆参照可能であるか、またはrが過去端です。
投稿:以前の値rのコピーは、参照を外すか、==のドメインになる必要はなくなりました。

最後の事後条件はa == bため、++a == ++btrueである必要はないことを意味しています。
同じ節、段落3:

[注:入力イテレータの場合 B ==は++ == ++ Bを意味するものではありません。 (等号では、代入プロパティや参照の透過性は保証されません)。入力イテレータのアルゴリズムは、同じイテレータを二度通過することは絶対にしないでください。それらはシングルパスアルゴリズムである必要があります。 [...]これらのアルゴリズムは、istream_iteratorクラステンプレートを使用して、入力データのソースとしてistreamを使用することができます。

  • 場合§24.2.5 [forward.iterators]

    P1クラスまたはポインタタイプX満たす前方イテレータの要件から末端音符]

    [...]

  • オブジェクトXのタイプは、以下に説明するマルチパス保証を提供します。

    • a == bが意味++a == ++b
    • Xがポインタ型または表現である(void)++X(a), *a等価である:

    P3つdereferenceableイテレータAおよびタイプXのBはが場合マルチパス保証を提供します式*aに変換します。

+5

だから典型的な例は、ストリームイテレータ(シングルパス、入力反復子)、および単独でリンクされたリスト(マルチパスフォワード反復子)かもしれない – jalf

+0

OH、によって、upboatを有します。 +1 – jalf

関連する問題