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

我正在遍历向量,并且需要迭代器当前指向的索引。可以通过两种方式完成此操作:

  • it - vec.begin()

  • std::distance(vec.begin(), it)

这些方法的优缺点是什么?


动漫人物
浏览 1452回答 3
3回答

慕码人8056858

it - vec.begin()正是由于Naveen给出的相反原因,我更喜欢:因此,如果将向量更改为列表,它将不会编译。如果您在每次迭代中都这样做,则很容易最终将O(n)算法转换为O(n ^ 2)算法。如果您在迭代过程中没有在容器中跳来跳去,另一种选择是将索引保留为第二个循环计数器。注意:it是容器迭代器的通用名称std::container_type::iterator it;。

芜湖不芜

正如UncleBens和Naveen所表明的,两者都有充分的理由。哪一个“更好”取决于您想要的行为:您想保证恒定时间的行为,还是希望在必要时回落到线性时间?it - vec.begin()需要花费固定的时间,但是operator -仅在随机访问迭代器上定义,因此,例如,代码根本不会使用列表迭代器进行编译。std::distance(vec.begin(), it) 适用于所有迭代器类型,但仅在随机访问迭代器上使用时才是恒定时间操作。谁都不是“更好”的人。使用一种可以满足您需求的工具。
打开App,查看更多内容
随时随地看视频慕课网APP