入力イテレータと読み取り専用のフォワードイテレータの違いは何ですか?
後者は読み取り専用であるため、明らかに出力イテレータの要件を満たしていません。そして、そのため、追加の保証(ある場合)を備えた入力イテレータを効果的に使用できます。問題は、どのような追加の保証ですか?
私の推測では、フォワードイテレータはマルチパスであり、入力イテレータはそうではありません。
入力イテレータと読み取り専用のフォワードイテレータの違いは何ですか?
後者は読み取り専用であるため、明らかに出力イテレータの要件を満たしていません。そして、そのため、追加の保証(ある場合)を備えた入力イテレータを効果的に使用できます。問題は、どのような追加の保証ですか?
私の推測では、フォワードイテレータはマルチパスであり、入力イテレータはそうではありません。
はい、入力反復子はワンパス反復子です。前方反復子はマルチパスですが、反復できるのは 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
です。