为什么std :: fill使用ForwardIterator而不是OutputIterator?

时间:2017-04-19 23:43:22

标签: c++ stl iterator

(此问题与Why does std::max_element require a ForwardIterator?具有相同的“问题模板”,但答案必须不同,因为std::fill不会将迭代器返回到输出序列。)

std::fill被定义为仅在输出范围由一对ForwardIterator给出时才起作用。但是,表面上相似的std::fill_n可以与OutputIterator一起使用。

当然算法只是

template<class OutIt, class T>
void fill(OutIt first, OutIt last, T value)
{
    while (first != last) {
        *first = value;
        ++first;
    }
}

这个算法怎么需要ForwardIterator?我错过了什么?

2 个答案:

答案 0 :(得分:7)

输出迭代器无法比较。 ==!=运算符未定义输出迭代器。

你需要一个前向迭代器,因为它

  

满足输入迭代器的要求

支持 EqualityComparable

对于输出迭代器,std::fill无法将firstlast进行比较:

while (first != last) {

不支持输出迭代器。

std::fill_n避免了这种比较,只是使用计数器写入迭代器,所以它只需要一个输出迭代器。

答案 1 :(得分:0)

没有&#34;范围&#34;为OutputIterator。因此,您必须提供重复计数。使用ForwardIterator,您可以处理各种元素。

这些是语义上不同的东西。 fill_n用于从提供的迭代器开始添加一些元素。 fill用于更改元素范围。

以插入器(例如back_inserter)为例。您可以插入比容器中更多的元素,因此last甚至没有意义。

OutputIterator为您提供了一个可以投掷物体的地方。 <{1}}对象必须存在。

来自cppreference

  

带有输出迭代器的operator *的唯一有效用法是在赋值的左侧:operator *可以返回一个代理对象,它定义一个成员operator =(可能是一个模板)

这意味着你基本上无法从中读取,这与ForwardIterator形成鲜明对比:

  

ForwardIterator是一个可以从指向元素读取数据的迭代器。