为了账号安全,请及时绑定邮箱和手机立即绑定

获取std :: vector的迭代器索引的最有效方法是什么?

获取std :: vector的迭代器索引的最有效方法是什么?

C++
动漫人物 2019-10-14 10:28:24
我正在遍历向量,并且需要迭代器当前指向的索引。可以通过两种方式完成此操作:it - vec.begin()std::distance(vec.begin(), it)这些方法的优缺点是什么?
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

it - vec.begin()正是由于Naveen给出的相反原因,我更喜欢:因此,如果将向量更改为列表,它将不会编译。如果您在每次迭代中都这样做,则很容易最终将O(n)算法转换为O(n ^ 2)算法。

如果您在迭代过程中没有在容器中跳来跳去,另一种选择是将索引保留为第二个循环计数器。

注意:it是容器迭代器的通用名称std::container_type::iterator it;


查看完整回答
反对 回复 2019-10-14
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

正如UncleBens和Naveen所表明的,两者都有充分的理由。哪一个“更好”取决于您想要的行为:您想保证恒定时间的行为,还是希望在必要时回落到线性时间?

it - vec.begin()需要花费固定的时间,但是operator -仅在随机访问迭代器上定义,因此,例如,代码根本不会使用列表迭代器进行编译。

std::distance(vec.begin(), it) 适用于所有迭代器类型,但仅在随机访问迭代器上使用时才是恒定时间操作。

谁都不是“更好”的人。使用一种可以满足您需求的工具。


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 1419 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信