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
。