为什么转发迭代器没有加法赋值运算符?

Why doesn't forward iterator have addition assignment operator?

本文关键字:赋值运算符 转发 迭代器 为什么      更新时间:2023-10-16

我知道std::forward_list<T>::iterator没有复合赋值运算符(operator+=)。但这是为什么呢?

我问这个有三个原因:

  1. 这个运算符不会像operator++()一样推进"前向"迭代器吗?
  2. 难道没有一个辅助函数std::advance()做同样的事情吗?
  3. 正在实现自己的转发列表(用于学习),我想知道operator+=()有什么问题。

使用:

std::advance(it, n);

<iterator>年宣布)

关键是,仅当运算具有 O(1) 成本时才提供复合赋值运算符。由于递增前向迭代器具有线性成本,因此最好将其显式化。

如果需要重复增量结果的新值,请使用:

auto it2 = std::next(it1, n);

但我不知道为什么?

前向迭代器一次只能向前推进一个单元。 +=通常用于一次使用多个单元。

这个运算符不会像operator++()一样推进"前向"迭代器吗?

它会的,但你可以像iterator += 10一样使用它,这会让你相信它会立即前进 10 位。 相反,它必须是 10 个单独的++调用。

没有做同样事情的辅助函数 std::advance() 吗?

是的,但它明确指出它是多个++调用,除非您使用随机迭代器。

正在实现自己的转发列表(用于学习),我想知道运算符+=()有什么问题

迭代器应符合前向迭代器的标准定义。

但我不知道为什么?

不同类别的迭代器必须遵循某些契约。描述可以在这里找到 您可以看到前向迭代器类别的合约是什么,std::forward_list<T>::iterator属于哪里,并且没有针对 RandomAccessIterator 的r += n操作