(此问题与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?我错过了什么?
答案 0 :(得分:7)
输出迭代器无法比较。 ==
和!=
运算符未定义输出迭代器。
你需要一个前向迭代器,因为它
满足输入迭代器的要求
支持 EqualityComparable 。
对于输出迭代器,std::fill
无法将first
与last
进行比较:
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是一个可以从指向元素读取数据的迭代器。