繁体   English   中英

STL填充和转发迭代器

[英]STL fill and forward iterator

根据大多数C ++引用,例如cplusplus.com, 前向迭代器不需要可赋值(我的意思是,引用左值)。 但是,对于需要写入值的几个STL算法,例如std::fill (也是std::generate等),规范使用了前向迭代器:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val);

而等效行为需要左值取消引用:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}

因此,它实际上是使用一个可变的前向迭代器和一次传递。

现在的问题是:

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

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

为什么使用正向迭代器而不是std::fillstd::generate等的输出迭代器,而实际上它们不需要多次传递? (例如, std::copy只需要输出迭代器。基本原理是什么?)

从签名

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);

你无法推断ForwardIterator是一个在前向迭代器中描述的迭代器 但是,如果您阅读参数说明,您会发现firstlast必须是

将迭代器转发支持被赋予类型T值的元素序列中的初始位置和最终位置。

(我强调)。 因此,前向迭代器只能满足前向迭代器的要求,它不是一个有效的参数。

考虑到fill的规范是(解除引用的)迭代器可以从T赋值,它对我来说似乎并不十分奇怪。 输出迭代器是不够的,因为它无法与确定范围结束相比,因此选择了具有需求的forward_iterator

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM