我有一些(模板化)迭代器对 Iterator begin1
和 Iterator end1
。我有一个带有签名的函数 foo
template <typename ForwardIterator>
void foo(ForwardIterator begin, ForwardIterator end);
在这个范围内做一些事情。现在,我想让 foo
不作用于实际范围元素,而是作用于通过某些 lambda 或某些函数 bar
对这些元素进行的转换。我无法使用 std::transform 或以其他方式使用临时存储来存储转换后的值,因为这会占用太多空间,或者因为我不允许在堆上分配任何内容。
现在,我知道我可以自己实现某种自适应迭代器,但我宁愿使用现成的东西,而不是重新发明轮子。
那么,有什么快速而肮脏的方法来获得合适的适应迭代器对,我可以将其传递给 foo
来完成我想要的事情呢?即我能够打电话
foo(magic(begin), magic(end))
或
auto new_pair = magic(begin, end);
foo(new_pair.first, new_pair.second);
?
最佳答案
埃里克·尼伯勒的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].
顺便说一句,这既懒惰又高效。 :)
关于c++ - 获得自适应迭代器的快速而肮脏的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40538413/