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;

但是,这个 won't work 并没有用来工作,因为我们cannot 无法创建临时容器的 View 。

UPDATE: This issue has been patchedthis commit .

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

最佳答案

看起来像 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/36820639/

相关文章:

android - 为什么我在使用 Android NDK r16 构建项目时收到来自 Android NDK r11 的错误消息?

c++ - 如何使用 range-v3 库迭代 C++ vector 并一次对两个值进行操作?

c++ - 虚拟析构函数仅在选定的基地

c++ - 如何遍历 wxNotebook 的页面?

c++ - range-v3 如何操作::使用定界符加入

c++ - MakeStream::iterate() 的 Range V3 是什么?

c++ - 将 gsl::span 与 range-v3 一起使用

c++ - range-v3:使用定界符连接管道范围

c++ - 在访问 Eigen::VectorXd 时使用零作为第二个索引是否安全?

c++ - 堆栈输出错误