将迭代器映射到特定字段上的迭代器(可以使用 Boost)
Map an iterator to an iterator over a specific field (can use Boost)
假设我有一个特定的算法,它适用于一系列整数。然后,该函数将在此范围内采用两个迭代器并完成其工作。
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>;
我想在TupleList
和SList
(分别)使用该算法。但是,直接迭代器不会像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
,包括适当的标头,它应该可以工作。
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 我可以使用反向迭代器作为ForwardIt吗
- 修改 std::vector 会使迭代器无效吗?
- 我可以将迭代器递增一个整数吗?
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 是否可以(重新)分配来自不同容器的迭代器?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 迭代器可以变成指针吗?
- 通用迭代器可以访问向量的元素,而无需使用模板C
- 我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何移动呢?
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 将迭代器映射到特定字段上的迭代器(可以使用 Boost)
- 反向迭代器可以用作普通迭代器吗?
- C++迭代器:抽象类的迭代器可以作为嵌套类实现吗
- 为什么 STL 向量的迭代器可以指向不存在的元素?
- 列表的迭代器可以返回非常量引用吗?
- 在C++中,是否可以实现一个迭代器接口,其中推进会使"current"元素无效?
- 编写一个迭代器,使多个容器看起来像一个容器
- 输入迭代器可以用于需要前向迭代器的地方吗
- 迭代器可以指向特定位置而不是 STL 集中的值吗?