如何获取 std::vector 的迭代器的索引?

新手上路,请多包涵

我正在迭代一个向量并需要迭代器当前指向的索引。以下方法的优缺点是什么?

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

原文由 cairol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

另一种选择是,如果您在迭代期间不在容器中跳转,则将索引保留为第二个循环计数器。

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

原文由 UncleBens 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您已经将您的算法限制/硬编码为仅使用 std::vector::iteratorstd::vector::iterator ,那么最终使用哪种方法并不重要。您的算法已经具体化,超出了选择另一个可以产生任何影响的程度。他们都做同样的事情。这只是个人喜好问题。我个人会使用显式减法。

另一方面,如果您希望在算法中保留更高程度的通用性,即允许将来某天将其应用于其他迭代器类型,那么最佳方法取决于您的意图.这取决于您希望对可在此处使用的迭代器类型的限制程度。

  • 如果您使用显式减法,您的算法将被限制在一个相当狭窄的迭代器类:随机访问迭代器。 (这是你现在从 std::vector 得到的)

  • 如果您使用 distance ,您的算法将支持更广泛的迭代器类别:输入迭代器。

当然,为非随机访问迭代器计算 distance 通常是一种低效的操作(而对于随机访问的迭代器,它与减法一样有效)。由你来决定你的算法是否对非随机访问迭代器 _有意义_,效率方面。如果由此导致的效率损失是毁灭性的,以至于使您的算法完全无用,那么您应该更好地坚持减法,从而禁止低效使用并迫使用户为其他迭代器类型寻求替代解决方案。如果非随机访问迭代器的效率仍在可用范围内,那么您应该使用 distance 并记录该算法对随机访问迭代器更有效的事实。

原文由 AnT stands with Russia 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题