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

Why doesn't forward iterator have addition assignment operator?

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

我问这个问题有以下三个原因:

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

使用:

std::advance(it, n);

(在 <iterator> 中声明)

重点是复合赋值运算符仅在运算成本为 O(1) 时提供。由于递增前向迭代器的成本是线性的,因此最好明确说明。

如果您想要一个重复递增的结果的新值,请使用:

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

But I don't know why ?

好吧,前向迭代器一次只能向前推进一个单元。 += 一般用于一次走多个单元。

wouldn't this operator advance the "forward" iterator like operator++() ?

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

Isn't there helper function std::advance() that does the same thing ?

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

I'm implementing my own forward list (for learning) and I want to know what's wrong with operator+=()

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

But I don't know why ?

不同类别的迭代器必须遵循一定的约定。可以找到说明here You can see what contract is for ForwardIterator category, where std::forward_list<T>::iterator belongs to, and there is no r += n operation which is for RandomAccessIterator