C++ 为什么';t前向迭代器是否具有加法赋值运算符?
我知道C++ 为什么';t前向迭代器是否具有加法赋值运算符?,c++,iterator,forward-list,C++,Iterator,Forward List,我知道std::forward\u list::iterator没有复合赋值运算符(operator+=)。但为什么呢 我问这个问题有三个原因: 这个操作符不会像操作符++()那样推进“向前”迭代器吗 难道没有一个辅助函数做同样的事情吗 我正在实现我自己的转发列表(用于学习),我想知道operator+=()有什么问题 使用: (在中声明) 关键是,复合赋值运算符仅在操作成本为O(1)时提供。由于递增前向迭代器具有线性成本,因此最好将其显式化 如果需要一个由重复增量产生的新值,请使用: auto
std::forward\u list::iterator
没有复合赋值运算符(operator+=
)。但为什么呢
我问这个问题有三个原因:
操作符++()
那样推进“向前”迭代器吗李>
operator+=()
有什么问题
中声明)
关键是,复合赋值运算符仅在操作成本为O(1)时提供。由于递增前向迭代器具有线性成本,因此最好将其显式化
如果需要一个由重复增量产生的新值,请使用:
auto it2 = std::next(it1, n);
但我不知道为什么
前向迭代器一次只能向前推进一个单元<代码>+=通常用于一次运行多个单元
这个操作符不会像操作符++()
那样推进“向前”迭代器吗
它会的,但是你可以像迭代器+=10
那样使用它,这会让你相信它会立即前进10位。相反,它必须是10个独立的++
调用
难道没有辅助函数std::advance()做同样的事情吗
是的,有,但它明确声明它是多个++
调用,除非您使用的是随机迭代器
我正在实现我自己的转发列表(用于学习),我想知道运算符+=()
迭代器应该符合前向迭代器的标准定义
但我不知道为什么
不同的类别迭代器必须遵循一定的约定。可以找到描述您可以看到类别的合同是什么,其中
std::forward_list::iterator
所属,并且没有针对r+=n
的操作,我希望有人回答这个问题,因为标准上这么说,“我很高兴(对于OP)您没有这样做+1.it+=2
真的比advance(it,2)
更不明确吗?@Barry:委员会认为是这样的。这并不是说+=2
不可理解,但人们并不认为这是一个昂贵的操作。迭代器是指针的泛化,当你看到+=2
时,你首先想到的是指针算法。@Barry:(我听说过迭代器连接到数据库的故事…@KerrekSB是的,我不怀疑这是正确的原因-但这只是一点。。。奇怪。下行投票人能解释这个问题出了什么问题吗?另外一个问题:如果添加负数怎么办?@Revolver\u Ocelot很好,可以通过对函数参数使用无符号类型来解决;)不幸的是,std::advance也允许这样做。
auto it2 = std::next(it1, n);