STL填充和转发迭代器

时间:2013-04-29 23:53:02

标签: c++ stl iterator

根据大多数C ++引用,例如cplusplus.com,forward iterators不需要可赋值(我的意思是,引用左值)。但是,对于需要写入值的几个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::fillstd::generate等的输出迭代器,而实际上它们不需要多次传递? (std::copy只需要输出迭代器。原理是什么?)

2 个答案:

答案 0 :(得分:5)

来自签名

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

你无法推断ForwardIteratorforward iterator中描述的迭代器。但是,如果您阅读参数说明,则会发现firstlast必须

  

Forward Iterators元素序列中的初始位置和最终位置,支持分配类型为T的值

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

答案 1 :(得分:1)

鉴于fill的规范是(解除引用的)迭代器可以从T分配,对我来说似乎并不十分奇怪。输出迭代器是不够的,因为它与确定范围结束不具有可比性,因此选择了具有需求的forward_iterator

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