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

Map an iterator to an iterator over a specific field (can use Boost)

本文关键字:迭代器 可以使 Boost 字段 映射      更新时间:2023-10-16

假设我有一个特定的算法,它适用于一系列整数。然后,该函数将在此范围内采用两个迭代器并完成其工作。

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)有没有办法从这样的解包器函数自动创建迭代器?

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

boost::transform_iterator似乎是一个合适的适配器。只需将some_magical_factory替换为 boost::make_transform_iterator ,包括适当的标头,它应该可以工作。