boost::adaptor::索引的基于范围的for循环



c++ 11基于范围的for循环对迭代器解引用。这是否意味着在boost::adaptors::indexed中使用它没有意义?例子:

boost::counting_range numbers(10,20);
for(auto i : numbers | indexed(0)) {
  cout << "number = " i 
  /* << " | index = " << i.index() */ // i is an integer!
  << "n";
}

我总是可以使用计数器,但我喜欢索引迭代器。

  • 是否有可能以某种方式使用基于范围的for循环?
  • 使用基于范围的循环和索引的习惯用法是什么?(只是一个普通的计数器?)

这在Boost 1.56(2014年8月发布)中修复;该元素间接位于具有index()value()成员函数的value_type后面。

示例:http://coliru.stacked-crooked.com/a/e95bdff0a9d371ea

auto numbers = boost::counting_range(10, 20);
for (auto i : numbers | boost::adaptors::indexed())
    std::cout << "number = " << i.value()
        << " | index = " << i.index() << "n";

在迭代集合时似乎更有用,在那里您可能需要索引位置(如果没有其他内容,则打印项目编号):

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

打印:

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

在整数范围内简单迭代的任何创新都受到经典的for循环的强烈挑战,它仍然是非常强大的竞争对手:

for (int a = 10; a < 20; a++) 

虽然这可以以多种方式扭曲,但要提出明显更具可读性的内容并不容易。

简短的回答(正如每个人在评论中提到的)是"对,这没有意义。"我也觉得这很烦人。根据你的编程风格,你可能会喜欢我写的"zipfor"包(只是一个头文件):

允许像

这样的语法
std::vector v;
zipfor(x,i eachin v, icounter) {
   // use x as deferenced element of x
   // and i as index
}

不幸的是,我无法找到使用基于范围的for语法的方法,不得不求助于"zipfor"宏:(

标题最初是为

这样的内容设计的
std::vector v,w;
zipfor(x,y eachin v,w) {
   // x is element of v
   // y is element of w (both iterated in parallel)
}

std::map m;
mapfor(k,v eachin m)
   // k is key and v is value of pair in m

我在经过全面优化的g++4.8上进行的测试表明,生成的代码并不比手工编写慢。

相关内容

  • 没有找到相关文章

最新更新