7

ほとんどの 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たとえば、出力イテレータのみが必要です。その根拠は何ですか?)

4

2 に答える 2

5

サインから

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);

forward iteratorForwardIteratorで説明されている反復子であると推測することはできません。ただし、パラメーターの説明を読むと、それがわかり、そうでなければなりませんfirstlast

T 型の値の割り当てをサポートする一連の要素の最初と最後の位置にイテレータを転送します。

(私による強調)。そのため、前方イテレーターに必要なもの以外は何も満たさない前方イテレーターは、有効な引数ではありません。

于 2013-04-30T00:25:12.380 に答える
1

fillの仕様が (逆参照された) イテレータが から代入可能であるということを考えると、私にはそれほど奇妙に思えませんT。出力反復子は、範囲の終わりを決定するのに比較できないため、十分ではありませんforward_iterator

出力イテレータを使用することに注意してください。これfill_n 、入力するシーケンスの最後を決定するためにイテレータの比較が必要ないためです。

于 2013-04-30T00:47:44.993 に答える