我想迭代自定义范围,像这样:
for(auto &all : data.getAll())
for(auto odd : data.getOdds())
for(auto X : data.getX())
...
我知道基于范围的循环使用迭代器,因此需要专门化begin(), end()。还有比这更干净的方法吗?
看一下Boost的实现。适配器。有几个命名的适配器使operator|
过载,以执行输入范围的滤波、转换等操作。
std::vector<int> vec(20);
std::iota(vec.begin(), vec.end(), 0);
using namespace boost::adaptors;
for(auto i : vec | filtered([](int i){ return i % 2 == 0; })
| transformed([](int i){ return i * 2; })
| reversed) {
std::cout << i << ' ';
}
std::cout << 'n';
上面的例子在输入范围加倍后只输出偶数,并反转结果范围。
现场演示