向量向量的范围范围
ranges of ranges to vector of vectors
假设我有一系列名为rng的T。我能做到
auto groups = ranges::view::group_by(rng, bin_op);
组现在是 T 的范围。
我也可以这样做
auto groups = ranges::view::group_by(rng, bin_op) | ranges::to_vector;
以获得 T 范围的向量。然而,这
auto groups = ranges::view::group_by(rng, bin_op)
| ranges::to_vector
| ranges::action::transform([] (auto r) { return r | ranges::to_vector; };
以及
auto groups = ranges::view::group_by(rng, bin_op)
| ranges::to_vector
| ranges::action::transform([] (auto r) { return std::vector<T>{} | ranges::action::push_back; };
不起作用,因为显然范围::action::transform(( 在这种情况下返回 void 并且"传递给 action::transform 的函数的结果类型必须可写回源范围"。
那么如何将范围范围转换为向量向量呢?
注意:很抱歉标签不好,但我找不到范围/范围-ts/ranges-v3标签,我不允许创建一个,也不能在标题中使用它。
您可以使用ranges::to
将范围范围转换为向量向量。例如:
#include <vector>
#include <iostream>
#include <range/v3/range/conversion.hpp>
#include <range/v3/view/all.hpp>
#include <range/v3/view/group_by.hpp>
#include <range/v3/view/transform.hpp>
int main() {
std::vector<int> rng {0,1,2,3,4,5,6,7,8,9};
auto groups = ranges::view::group_by(rng, [](int i, int j){
return j/3 == i/3;
});
auto vs = groups | ranges::to<std::vector<std::vector<int>>>;
// Display the result: [[0,1,2],[3,4,5],[6,7,8],[9]]
std::cout << ranges::view::transform(vs, ranges::view::all) << std::endl;
}
2020 年 6 月 10 日:以前,此答案建议简单地将groups
分配给vector<vector<int>>
变量,因为 range-v3 用于支持从视图到容器的隐式转换。隐式转换是有问题的,因此它们被丢弃了。ranges::to
现在是这样做的惯用方法。
假设您使用的是 Rangesv3,我对文档的阅读给了我这样的内容:
auto groups = ranges::view::group_by(rng, bin_op)
| ranges::view::transform( ranges::to_vector )
| ranges::to_vector;
或者也许
auto groups = ranges::view::group_by(rng, bin_op)
| ranges::view::transform( [] (auto r) { return r | ranges::to_vector; } )
| ranges::to_vector;
(我记得ranges::to_vector
可以以函数式的方式使用,但我可能是错的,或者事情可能会改变。 第一个假设它可以;第二个没有。
这样做的作用是首先将惰性范围转换为向量延迟范围。
然后,它将向量的延迟范围转换为向量的向量。
这效果更好(由内而外(,因为中间产品在"外部"是懒惰的。 可能有一种方法可以从外到内做到这一点,但是惰性范围的向量必须以惰性向量没有的方式实际存在。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 布尔值向量的基于范围 for 循环
- 如何使用count_if计算向量中的可变数字范围
- 范围 v3 的和向量
- 关于在向量向量上使用基于范围的 for 循环
- 使用基于范围的指针循环和向量时出现C++错误
- 用基于范围的for循环填充指针向量
- 创建结构体向量,表达式:向量下标超出范围
- 代码超出范围.如何动态分配此向量?
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 从给定范围内的向量中查找最大元素
- 向量向量的范围范围
- 将局部变量保存到全局向量中,为什么离开局部范围后可以得到这些局部变量?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 在 c++ 中检查 if 条件中的向量位置范围
- 向量下标超出向量向量的范围
- 如何正确使用向量范围构造函数