13

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

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

私の推測では、フォワードイテレータはマルチパスであり、入力イテレータはそうではありません。

4

1 に答える 1

23

はい、入力反復子はワンパス反復子です。前方反復子はマルチパスですが、反復できるのは 1 回だけです。

から§24.2.3 [input.iterators] p2 (the table)、 の事前/事後条件列++r:

pre:r逆参照可能です。
post:r逆参照可能であるかr、終わりを過ぎています。
post: の以前の値のコピーは、r逆参照可能である必要も、 のドメインにある必要もありません==

最後の事後条件は、 forがa == b++a == ++bある必要がないことを意味しますtrue
同項第 3 段落:

[注:入力反復子の場合、a == bは++a == ++bを意味しません。(等価性は、置換プロパティまたは参照透過性を保証するものではありません。) 入力反復子のアルゴリズムは、同じ反復子を 2 回通過することは決してありません。それらはシングル パスアルゴリズムである必要があります。istream_iterator[...] これらのアルゴリズムは、クラス テンプレートを介して入力データのソースとして istream と共に使用できます。—終わりのメモ]

から§24.2.5 [forward.iterators]

p1 次の場合、クラスまたはポインター型Xは前方反復子の要件を満たします。

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

p3 タイプの 2 つの参照解除可能な反復子 a と b は、次の場合にマルチパス保証Xを提供します。

  • a == b暗示++a == ++bして
  • Xがポインタ型であるか、式(void)++X(a), *aが式と同等*aです。
于 2012-01-15T10:58:27.363 に答える