Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::fill使用ForwardIterator而不是OutputIterator?_C++_Stl_Iterator - Fatal编程技术网

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.想象一下,如果输出迭代器输出到连接到终端的
流。比较这两个迭代器意味着什么?我想比较general
istream
迭代器也没有意义,尽管有一个比较单一迭代器(表示文件结束或错误)以读取流的其余部分的有用案例;而对于输出,没有“直到文件结束才写入”@M.M(第二条注释):完全正确!一般来说,输入和输出迭代器是不可比较的,但有时它们是可以比较的。例如,
ostream_iterator::operator==
的语义可能类似于
istream_iterator::operator==
,即在底层流上返回
(!x.ready()&!y.ready())| |(&x=&y)
。当然,这主要适用于希望“在磁盘错误或文件系统已满之前写入相同字节”的程序,这可能是一种罕见的情况我认为你的编辑实际上把这个答案从“好”变成了“坏”
std::fill
不尝试读取其迭代器参数;它只在作业的左侧使用
*x
。所以引入factoid激发了我的问题,但这无助于回答它。另一个对比
ForwardIterator
的引用是否必须是可读的?我知道
fill
不读取元素,但这并不重要。它被设计用于在一系列元素上工作。我不确定您是否不理解迭代器类型之间的区别,或者不理解使您所建议的实现不可能实现的技术性。我向前者致辞。后者在另一份答复中作了解释。也许这个对将来的其他人有用。