c++ - 获得自适应迭代器的快速而肮脏的方法是什么?

标签 c++ iterator range adapter

我有一些(模板化)迭代器对 Iterator begin1Iterator 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/

相关文章:

c++ - 如何禁用此代码中的纹理?

c++ - 函数调用给我错误表达式必须有类类型

用于深度嵌套私有(private)数据的 C++/STL 公共(public)迭代器

C++ 错误 : Conversion to Non-Scalar Type

c# - 中断使用 Enumerable.Range 的 IEnumerable<int> 查询

c++ - CFRelease 导致崩溃

c++ - CMake 错误 : Could not find include directory and library

c++ - 何时不在 C 中创建单独的接口(interface) (.h) 和实现 (.c)?

swift 范围 : not including first element

python - 步长为浮点型的范围