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上进行的测试表明,生成的代码并不比手工编写慢。