C++ 为什么std::fill使用ForwardIterator而不是OutputIterator?
(此问题的“问题模板”与相同,但答案必须不同,因为C++ 为什么std::fill使用ForwardIterator而不是OutputIterator?,c++,stl,iterator,C++,Stl,Iterator,(此问题的“问题模板”与相同,但答案必须不同,因为std::fill不会在输出序列中返回迭代器。) 定义为仅当输出范围由一对ForwardIterator给定时才起作用。然而,这种表面上相似的方法可以很好地与outputiator配合使用 当然,算法很简单 template<class OutIt, class T> void fill(OutIt first, OutIt last, T value) { while (first != last) { *f
std::fill
不会在输出序列中返回迭代器。)
定义为仅当输出范围由一对ForwardIterator给定时才起作用。然而,这种表面上相似的方法可以很好地与outputiator配合使用
当然,算法很简单
template<class OutIt, class T>
void fill(OutIt first, OutIt last, T value)
{
while (first != last) {
*first = value;
++first;
}
}
模板
空隙填充(先出,后出,T值)
{
while(第一个!=最后一个){
*第一个=值;
++第一,;
}
}
这个算法需要ForwardIterator吗?我缺少什么?输出迭代器是不可比较的。
==
和=未为输出迭代器定义代码>运算符
您需要一个正向迭代器,因为它
满足输入迭代器的要求
它支持EqualityComparable
对于输出迭代器,std::fill
无法将第一个
与最后一个
进行比较:
while (first != last) {
不支持,用于输出迭代器
std::fill\u n
避免了这种比较,它只使用计数器写入迭代器,因此它只需要一个输出迭代器。对于输出迭代器,没有“范围”的概念。因此,您必须提供重复计数。使用ForwardIterator
可以处理一系列元素
这些是语义上不同的东西fill\n
用于从提供的迭代器开始添加一些元素<代码>填充
用于更改元素范围
以插入器(例如back\u插入器
)为例。您可以插入比容器中更多的元素,因此last
甚至没有意义
OutputIterator
为您提供了一个可以放入对象的位置<代码>转发迭代器
对象必须存在
发件人:
运算符*与输出迭代器的唯一有效用法是在赋值的左侧:运算符*可能返回一个代理对象,该对象定义了一个成员运算符=(可能是一个模板)
这意味着您基本上无法从中读取,这与ForwardIterator
相反:
ForwardIterator是一个迭代器,可以从指向的元素读取数据
哦,这是关于平等的可比性。不幸的是,目前的标准概念将“平等可比”和“投入可比”的概念联系在一起-我认为有类似于
类SentineDestreamIterator
的东西是合理的,它具有相等的可比性o1==o2
和可赋值性*o1=v
,但仍然不允许您从中读取v=*o1
。但是,好的,在当前的概念层次结构中,我明白了为什么输出迭代器没有受到足够的约束。@quxplusone一般的输出迭代器是没有意义的;e、 g.想象一下,如果输出迭代器输出到连接到终端的流。比较这两个迭代器意味着什么?我想比较generalistream
迭代器也没有意义,尽管有一个比较单一迭代器(表示文件结束或错误)以读取流的其余部分的有用案例;而对于输出,没有“直到文件结束才写入”@M.M(第二条注释):完全正确!一般来说,输入和输出迭代器是不可比较的,但有时它们是可以比较的。例如,ostream_iterator::operator==
的语义可能类似于istream_iterator::operator==
,即在底层流上返回(!x.ready()&!y.ready())| |(&x=&y)
。当然,这主要适用于希望“在磁盘错误或文件系统已满之前写入相同字节”的程序,这可能是一种罕见的情况我认为你的编辑实际上把这个答案从“好”变成了“坏”std::fill
不尝试读取其迭代器参数;它只在作业的左侧使用*x
。所以引入factoid激发了我的问题,但这无助于回答它。另一个对比ForwardIterator
的引用是否必须是可读的?我知道fill
不读取元素,但这并不重要。它被设计用于在一系列元素上工作。我不确定您是否不理解迭代器类型之间的区别,或者不理解使您所建议的实现不可能实现的技术性。我向前者致辞。后者在另一份答复中作了解释。也许这个对将来的其他人有用。