6

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 循环以某种方式使用它们?
  • 将基于范围的循环与索引一起使用的习惯用法是什么?(只是一个普通的柜台?)
4

2 回答 2

2

这已在 Boost 1.56(2014 年 8 月发布)中得到修复;该元素被间接在value_typewithindex()value()成员函数后面。

示例: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";
于 2016-01-21T15:23:51.390 回答
0

简短的回答(正如评论中提到的每个人)是“正确的,这没有任何意义。” 我也发现这很烦人。根据您的编程风格,您可能会喜欢我编写的“zipfor”包(只是一个标题):来自 github

它允许语法如

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 的全面优化测试表明,生成的代码并不比手动编写慢。

于 2014-08-25T18:56:27.547 回答