c – STL填充和转发迭代器

前端之家收集整理的这篇文章主要介绍了c – STL填充和转发迭代器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
根据大多数C引用,例如cplusplus.com,forward iterators不需要可赋值(我的意思是,参考左值).但是,对于需要写入值的几个STL算法,例如 std::fill(也是std :: generate等),规范使用了前向迭代器:
template <class ForwardIterator,class T>
  void fill (ForwardIterator first,ForwardIterator last,const T& val);

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

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

所以,它实际上是使用一个带有单个传递的可变前向迭代器.

现在的问题是:

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

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

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

解决方法

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

你不能推断出ForwardIterator是forward iterator中描述的迭代器.但是,如果你读了参数描述,你会发现第一个和最后一个必须是

07001 to the initial and final positions in a sequence of elements that support being assigned a value of type T.

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

猜你在找的C&C++相关文章