在 C++20 中将多个范围适配器连接到一个范围中
Concatenate multiple range adaptors into one single ranges in C++20
考虑以下情况:
std::vector<int> v{0, 1, 2, 3, 4, 5};
// 0 1 2 3 4 5
auto rng1 = std::views::all(v);
// 5 4 3 2 1 0
auto rng2 = std::views::reverse(v);
// 4 2 0
auto rng3 = std::views::filter(rng2, [](int x){return x % 2 == 0;});
有没有一种优雅的方法将这三个适配器连接到一个视图中,如下所示:
// 0 1 2 3 4 5 5 4 3 2 1 0 4 2 0
auto final_rng = std::views::concat(rng1, rng2, rng3);
这似乎是不可能的,因为rng1
、rng2
和rng3
是非常不同的类型。
有人可以给出替代解决方案吗?谢谢。
是的,您只是在不同的命名空间中编写的内容 - 标准库中没有 concat,但在 range-v3 中有一个:
auto final_rng = ranges::views::concat(rng1, rng2, rng3);
范围是不同类型的事实并不构成问题。你只有一个迭代器,它由范围的基础迭代器的变体构建而成。重要的部分是范围的值类型是相同的 - 在这里,所以这完全没问题。
标准中实际上有一个 concat(( 与 C++23 2/3 一起提供。查看规格: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2214r0.html
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何设置一个范围来提取我想要获得的信息
- 不计算一个范围内的完美数
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 在 C++20 中将多个范围适配器连接到一个范围中
- 转到基于范围的 for 循环中的下一个迭代器
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 有没有办法在另一个函数中加入线程?(即超出其自身范围)
- 如何将一个范围替换为矢量中的另一个范围?
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- 定义一个 void f(void) 函数,但使用来自同一范围的变量?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 如何使用基于范围的for循环迭代Rapidjson文档(它本身就是一个JSON数组)
- 将整数范围映射到另一个范围
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 检查IP是否在其他IP网络范围内,并查找下一个可用IP
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 基于范围的 for 循环将对象移动到另一个容器中?