根据大多数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::fill
,std::generate
等的输出迭代器,而实际上它们不需要多次传递? (std::copy
只需要输出迭代器。原理是什么?)
答案 0 :(得分:5)
来自签名
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
你无法推断ForwardIterator
是forward iterator中描述的迭代器。但是,如果您阅读参数说明,则会发现first
和last
必须
Forward Iterators到元素序列中的初始位置和最终位置,支持分配类型为T的值。
(我强调)。因此,前向迭代器只能满足前向迭代器的要求,并不是一个有效的参数。
答案 1 :(得分:1)
鉴于fill
的规范是(解除引用的)迭代器可以从T
分配,对我来说似乎并不十分奇怪。输出迭代器是不够的,因为它与确定范围结束不具有可比性,因此选择了具有需求的forward_iterator
。
您会注意到fill_n
使用输出迭代器,因为不需要迭代器比较来确定要填充的序列的结尾。