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