充当过滤器的范围——不同的迭代器集合



我想迭代自定义范围,像这样:

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';

上面的例子在输入范围加倍后只输出偶数,并反转结果范围。

现场演示

最新更新