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

Lai*_*ith 3 c++ iterator forward-list

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

我问这个有三个原因:

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

Ker*_* SB 9

使用:

std::advance(it, n);
Run Code Online (Sandbox Code Playgroud)

(在<iterator>.中声明)

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

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

auto it2 = std::next(it1, n);
Run Code Online (Sandbox Code Playgroud)

  • 我期待有人回答这个问题,"因为标准是这么说的"我很高兴(对OP来说)你没有.+1. (3认同)

Nat*_*ica 5

但我不知道为什么?

好的前进迭代器一次只能向前推进一个单元. +=通常用于一次超过一个单位.

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

它会,但你可以使用它iterator += 10,这会让你相信它会立即前进10个位置.相反,它必须是10个单独的++呼叫.

是不是有帮助函数std :: advance()做同样的事情?

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

我正在实现我自己的前向列表(用于学习),我想知道operator + =()有什么问题

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