ほとんどの C++ リファレンス (cplusplus.com など) によると、前方反復子は割り当て可能である必要はありません (つまり、左辺値に依存します)。ただし、値を書き込む必要があるいくつかの STL アルゴリズムでは、たとえばstd::fill
(これもstd::generate
)、仕様では前方反復子が使用されます。
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
同等の動作には左辺値の逆参照が必要です。
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
while (first != last) {
*first = val;
++first;
}
}
したがって、実際には単一パスで可変前方反復子を使用しています。
質問は次のとおりです。
(1) これらの場合に使用される前方反復子が変更可能であることを明確にしないのはなぜですか?
(2)更新: 次の質問がばかげていることがわかりました: 出力反復子が等価比較をサポートする必要がないことを一時的に忘れていました。とにかく、上記の質問は残ります。
実際には複数のパスを必要としないのにstd::fill
、などの出力反復子の代わりに前方反復子を使用するのはなぜですか? std::generate
(std::copy
たとえば、出力イテレータのみが必要です。その根拠は何ですか?)