STL填充和转发迭代器

4ae*_*1e1 7 c++ iterator stl

根据大多数C++引用,例如cplusplus.com,前向迭代器不需要是可赋值的(我的意思是,引用左值).但是,对于需要写入值的几个STL算法std::fill(例如std::generate等),规范使用了前向迭代器:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val);
Run Code Online (Sandbox Code Playgroud)

而等效行为需要左值取消引用:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,它实际上是使用一个可变的前向迭代器和一次传递.

现在的问题是:

(1)为什么不明确这些情况下使用的前向迭代器是否可变?

(2)更新:我发现以下问题是愚蠢的:我暂时忘记了输出迭代器不需要支持相等比较.无论如何,上述问题仍然存在.

为什么使用前向迭代器,而不是输出迭代器std::fill,std::generate等等,而他们实际上并不需要多遍?(std::copy例如,只需要输出迭代器.基本原理是什么?)

Osw*_*ald 5

从签名

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
Run Code Online (Sandbox Code Playgroud)

你不能推断这ForwardIterator是一个在前向迭代器中描述的迭代器.但是,如果您阅读参数说明,您将发现first并且last必须是

将迭代器转发支持被赋予类型T值的元素序列中的初始位置和最终位置.

(我强调).因此,前向迭代器只能满足前向迭代器的要求,它不是一个有效的参数.