将迭代器映射到特定字段上的迭代器(可以使用Boost)

时间:2017-01-03 10:58:37

标签: c++ c++11 boost iterator

假设我有一个特定的算法可以在一系列整数上运行。然后,该函数将在此范围内使用两个迭代器并完成其工作。

template <typename It>
void doWork(It begin, It end) {
    int x = *begin; // range is over integers
    // ...
}

假设我有两个数据结构:

struct S { int x; }

using TupleList = std::vector<std::tuple<int, double>>;
using SList = std::vector<S>;

我想在TupleListSList(单独)上使用该算法。但是,直接迭代器不能用作TupleList,而SList不能直接包含整数。

一种解决方案是另外向算法传递一个函子来解包迭代器:

template <typename It, typename Unwrap>
void doWork(It begin, It end, Unwrap unwrap) {
    int x = unwrap(*begin);
    // And so on
}
// -----
auto Sunwrapper = [](const S& s) { return s.x; }
doWork(begin(Slist), end(Slist), Sunwrapper);

但我更喜欢保持功能整洁。在C ++(加上Boost)中有没有办法从这样的unwrapper函数中自动创建迭代器?

auto unwrappedBegin = some_magical_factory(begin(Slist), Sunwrapper);
auto unwrappedEnd   = some_magical_factory(end  (Slist), Sunwrapper);

doWork(unwrappedBegin, unwrappedEnd);

1 个答案:

答案 0 :(得分:2)

boost::transform_iterator似乎是适合此的适配器。只需将some_magical_factory替换为boost::make_transform_iterator,包含相应的标题,它就应该有效。