Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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
STL填充前向迭代器 根据大多数C++引用,例如CPLUS PLUSSUL,不需要是可分配的(我的意思是,推迟到LValk)。但是,对于一些需要写入值的STL算法,例如(也包括std::generate等),规范使用前向迭代器: template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val); 模板 空白填充(ForwardIterator first、ForwardIterator last、const T&val);_C++_Stl_Iterator - Fatal编程技术网

STL填充前向迭代器 根据大多数C++引用,例如CPLUS PLUSSUL,不需要是可分配的(我的意思是,推迟到LValk)。但是,对于一些需要写入值的STL算法,例如(也包括std::generate等),规范使用前向迭代器: template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val); 模板 空白填充(ForwardIterator first、ForwardIterator last、const T&val);

STL填充前向迭代器 根据大多数C++引用,例如CPLUS PLUSSUL,不需要是可分配的(我的意思是,推迟到LValk)。但是,对于一些需要写入值的STL算法,例如(也包括std::generate等),规范使用前向迭代器: template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val); 模板 空白填充(ForwardIterator first、ForwardIterator last、const T&val);,c++,stl,iterator,C++,Stl,Iterator,虽然等效行为需要左值解引用: template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val) { while (first != last) { *first = val; ++first; } } 模板 空白填充(ForwardIterator first、ForwardIterator

虽然等效行为需要左值解引用:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}
模板
空白填充(ForwardIterator first、ForwardIterator last、const T&val)
{
while(第一个!=最后一个){
*第一个=val;
++第一,;
}
}
因此,它实际上使用了一个具有单个过程的可变前向迭代器

现在的问题是:

(1) 为什么不明确在这些情况下使用的前向迭代器是可变的

(2) 更新:我发现以下问题很愚蠢:我暂时忘记了输出迭代器不需要支持相等比较。无论如何,上述问题仍然存在

为什么对
std::fill
std::generate
等使用前向迭代器而不是输出迭代器,而它们实际上不需要多次传递?(
std::copy
只需要输出迭代器,例如,其原理是什么?

来自签名

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
模板
空白填充(ForwardIterator first、ForwardIterator last、const T&val);
无法推断
ForwardIterator
是中描述的迭代器。但是,如果阅读参数说明,您会发现
first
last
必须是

到元素序列中的初始和最终位置,这些元素支持分配类型为T的值


(我强调)。因此,只满足前向迭代器所需功能的前向迭代器不是有效参数。

鉴于
fill
的规范是(取消引用的)迭代器可从
t
赋值,我觉得这并不奇怪。输出迭代器是不够的,因为它无法确定范围结束,所以选择了一个带有需求的
前向迭代器


您会注意到,
fill\n
确实使用输出迭代器,因为不需要迭代器比较来确定要填充的序列的结尾。

前向迭代器不需要是可分配的
,您是如何确定的?我很确定它们是可分配的。@JesseGood出于实际目的,它们几乎总是可分配的,但如果你阅读参考资料,它就不是了。@JesseGood我也发现了这个,所以:谢谢你的链接,我不知道。“我想,这个链接也能回答你的问题。”“谢谢你,这是一篇有趣的文章。”。在阅读了你提到的线程之后,这个问题在我看来更像是标准中的一个缺陷。是的,这是一个很好的观点。但是,从标准的角度来看,签名是很棘手的。另一种方法是为前向迭代器引入一个新名称,支持将assignemt分配给pointed to元素。我认为OP的观点是,前向迭代器概念是必需的,但不足以指定参数类型的要求。“输出迭代器”也是如此;只有通过要求参数为“两者”,我们才能得到正确的语义。换句话说,有一些前向迭代器不能在其上调用
std::fill