使用基于范围的 for 循环时需要迭代器

新手上路,请多包涵

目前,我只能使用以下方法进行基于范围的循环:

 for (auto& value : values)

但有时我需要一个值的迭代器,而不是引用(无论出于何种原因)。有没有什么方法不需要经过整个向量比较值?

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

阅读 595
2 个回答

使用旧的 for 循环:

 for (auto it = values.begin(); it != values.end();  ++it )
{
       auto & value = *it;
       //...
}

有了这个,你就有了 value 以及迭代器 it 。使用你想使用的任何东西。


编辑:

虽然我不建议这样做,但如果你想使用基于范围的 for 循环(是的, _无论出于何种原因_:D),那么你可以这样做:

  auto it = std::begin(values); //std::begin is a free function in C++11
 for (auto& value : values)
 {
     //Use value or it - whatever you need!
     //...
     ++it; //at the end OR make sure you do this in each iteration
 }

这种方法避免了搜索给定 value ,因为 valueit 总是同步的。

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

Boost 有一个非常好的范围适配器 索引

   #include <boost/range/adaptors.hpp>
  std::vector<std::string> list = {"boost", "adaptors", "are", "great"};
  for (auto v: list | boost::adaptors::indexed(1)) {
    printf("%ld: %s\n", v.index(), v.value().c_str());
  }

输出:

 1: boost
2: adaptors
3: are
4: great

这里我们从 1 ( boost::adaptors::indexed(1) ) 开始索引,但我们也可以轻松地从任何其他值开始索引。

它是一个索引,而不是迭代器,但迭代器最常见的用法是

  • 将其转换为索引以访问另一个向量中的项目。
  • 报告/返回发生某事的位置。
  • 像以前一样访问一些相邻的值。
  • 装饰某种输出。

所有这些也可以直接用索引来完成。另一方面,将循环内部的迭代器传递给其他地方以完全用作迭代器看起来是相当复杂的方法。

原文由 Audrius Meškauskas 发布,翻译遵循 CC BY-SA 4.0 许可协议

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