我有一些(模板化的)迭代器对Iterator begin1
和Iterator 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);
答案 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].
顺便说一句,这都是懒惰和高效的。 :)