我知道std::forward_list<T>::iterator
没有复合赋值运算符(operator+=
)。但这是为什么呢?
我问这个有三个原因:
- 这个运算符不会像
operator++()
一样推进"前向"迭代器吗? - 难道没有一个辅助函数
std::advance()
做同样的事情吗?
我 - 正在实现自己的转发列表(用于学习),我想知道
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
操作