我正在遍历向量,并且需要迭代器当前指向的索引。可以通过两种方式完成此操作: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;
。
芜湖不芜
TA贡献1796条经验 获得超7个赞
正如UncleBens和Naveen所表明的,两者都有充分的理由。哪一个“更好”取决于您想要的行为:您想保证恒定时间的行为,还是希望在必要时回落到线性时间?
it - vec.begin()
需要花费固定的时间,但是operator -
仅在随机访问迭代器上定义,因此,例如,代码根本不会使用列表迭代器进行编译。
std::distance(vec.begin(), it)
适用于所有迭代器类型,但仅在随机访问迭代器上使用时才是恒定时间操作。
谁都不是“更好”的人。使用一种可以满足您需求的工具。
- 3 回答
- 0 关注
- 1451 浏览
添加回答
举报
0/150
提交
取消