我正在迭代一个向量并需要迭代器当前指向的索引。以下方法的优缺点是什么?
it - vec.begin()
std::distance(vec.begin(), it)
原文由 cairol 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在迭代一个向量并需要迭代器当前指向的索引。以下方法的优缺点是什么?
it - vec.begin()
std::distance(vec.begin(), it)
原文由 cairol 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您已经将您的算法限制/硬编码为仅使用 std::vector::iterator
和 std::vector::iterator
,那么最终使用哪种方法并不重要。您的算法已经具体化,超出了选择另一个可以产生任何影响的程度。他们都做同样的事情。这只是个人喜好问题。我个人会使用显式减法。
另一方面,如果您希望在算法中保留更高程度的通用性,即允许将来某天将其应用于其他迭代器类型,那么最佳方法取决于您的意图.这取决于您希望对可在此处使用的迭代器类型的限制程度。
如果您使用显式减法,您的算法将被限制在一个相当狭窄的迭代器类:随机访问迭代器。 (这是你现在从 std::vector
得到的)
如果您使用 distance
,您的算法将支持更广泛的迭代器类别:输入迭代器。
当然,为非随机访问迭代器计算 distance
通常是一种低效的操作(而对于随机访问的迭代器,它与减法一样有效)。由你来决定你的算法是否对非随机访问迭代器 _有意义_,效率方面。如果由此导致的效率损失是毁灭性的,以至于使您的算法完全无用,那么您应该更好地坚持减法,从而禁止低效使用并迫使用户为其他迭代器类型寻求替代解决方案。如果非随机访问迭代器的效率仍在可用范围内,那么您应该使用 distance
并记录该算法对随机访问迭代器更有效的事实。
原文由 AnT stands with Russia 发布,翻译遵循 CC BY-SA 2.5 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答469 阅读✓ 已解决
我更喜欢
it - vec.begin()
正是因为 Naveen 给出的相反原因:所以如果你将向量更改为列表,它就 不会 编译。如果你在每次迭代中都这样做,你很容易最终将 O(n) 算法变成 O(n^2) 算法。另一种选择是,如果您在迭代期间不在容器中跳转,则将索引保留为第二个循环计数器。
注意:
it
是容器迭代器的通用名称,std::container_type::iterator it;
。