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)更新:我发现下面的问题很愚蠢:我暂时忘记了输出迭代器不需要支持相等比较。无论如何,上述问题仍然存在。

为什么使用前向迭代器而不是输出迭代器 forstd::fillstd::generate,而它们实际上并不需要多次传递?(std::copy例如,只需要输出迭代器。理由是什么?)

4

2 回答 2

5

从签名

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

您无法推断出它ForwardIterator是前向迭代器中描述的迭代器。但是,如果您阅读参数说明,您会发现first并且last必须是

将迭代器转发到支持分配类型 T 值的元素序列中的初始位置和最终位置。

(我强调)。因此,仅满足前向迭代器要求的前向迭代器不是有效参数。

于 2013-04-30T00:25:12.380 回答
1

这对我来说似乎并不奇怪,因为规范fill是(取消引用的)迭代器可以从T. 输出迭代器是不够的,因为它无法确定范围结束,因此forward_iterator选择了 with requirements 。

您会注意到它fill_n 确实使用了输出迭代器,因为不需要迭代器比较来确定要填充的序列的结尾。

于 2013-04-30T00:47:44.993 回答