获得适应迭代器是一种快速而又肮脏的方法?

时间:2016-11-10 22:52:39

标签: c++ iterator range adapter

我有一些(模板化的)迭代器对Iterator begin1Iterator end1。我有一个函数foo,带有签名

template <typename ForwardIterator>
void foo(ForwardIterator begin, ForwardIterator end);

在该范围内做了一些事情。现在,我希望foo不对实际的范围元素起作用,而是通过某些lambda或某个函数bar对这些元素进行转换。我不能使用std :: transform或以其他方式使用temorary存储来获取转换后的值,因为这会占用太多空间,或者因为我不允许在其上分配任何内容。堆。

现在,我知道我可以自己实现某种调整迭代器,但我宁愿使用现成的东西而不是重新发明轮子。

那么,为了获得foo来做我想要的事情,我可以通过一种快速而肮脏的方式来获得适当的迭代器对。即我能打电话

foo(magic(begin), magic(end))

auto new_pair = magic(begin, end);
foo(new_pair.first, new_pair.second);

1 个答案:

答案 0 :(得分:2)

Eric Niebler的range-v3库为此提供了一个非常好的解决方案,并计划包含在未来的标准中。这是一个简单的例子:

std::vector<int> vi{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
using namespace ranges;
auto rng = vi | view::transform([](int x){ return x % 2; });
foo(rng.begin(), rng.end());  // When foo dereferences these iterators, it
                              // will see: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0].

顺便说一句,这都是懒惰和高效的。 :)