c++ - 如何编写使用临时容器的范围管道?

标签 c++ range-v3

我有一个带有这个签名的第三方函数:

std::vector<T> f(T t);

我还有一个名为 srcT 的现有潜在无限范围 ( of the range-v3 sort)。我想创建一个管道,将 f 映射到该范围内的所有元素,并将所有 vector 及其所有元素展平到一个范围内。

出于本能,我会写下以下内容。

 auto rng = src | view::transform(f) | view::join;

但是,这个不会工作 以前没有工作,因为我们不能不能创建临时容器的 View 。

UPDATE: This issue has been patched通过 this commit .

range-v3 如何支持这样的范围管道?

最佳答案

看起来像there are now test cases in the range-v3 library显示如何正确执行此操作。有必要将 views::cache1 运算符添加到管道中:

auto rng = views::iota(0,4)
        | views::transform([](int i) {return std::string(i, char('a'+i));})
        | views::cache1
        | views::join('-');
check_equal(rng, {'-','b','-','c','c','-','d','d','d'});
CPP_assert(input_range<decltype(rng)>);
CPP_assert(!range<const decltype(rng)>);
CPP_assert(!forward_range<decltype(rng)>);
CPP_assert(!common_range<decltype(rng)>);

所以 OP 问题的解决方案是写

auto rng = src | views::transform(f) | views::cache1 | views::join;

关于c++ - 如何编写使用临时容器的范围管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822467/

相关文章:

java - 在这个应用程序中通过 JNI 实现 C++ 代码是否值得?

c++ - 向函数提供参数时使用 '<<' 运算符

c++ - C++20 中的 iterator_category 和 iterator_concept 有什么区别?

c++ - 在 getter 中对嵌套 getter 结果进行扁平化的最佳方法

c++ - 为什么有变异的 Boost.Range 算法的 const 重载?

c++ - 有没有办法禁止 C++ 中的指针比较?

c++ - Raspicam的慢帧率捕获视频

c++ - cin.get() 是非阻塞的

c++11 - 为什么 std::back_inserter 迭代器在范围 3 中不是弱增量的?

c++ - 如何有条件地链接 ranges::view?