假设我有一系列名为rng的T&#t。我能做到
auto groups = ranges::view::group_by(rng, bin_op);
群组现在是一系列范围的。
我也可以这样做
auto groups = ranges::view::group_by(rng, bin_op) | ranges::to_vector;
获取T& s范围的向量。不过这个
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; };
由于显然range :: action :: transform()在这种情况下返回void而且&#34;传递给action :: transform的函数的结果类型必须可写回源范围& #34;
那么如何将范围范围转换为矢量矢量?
注意:抱歉有不好的标签,但我找不到范围/范围-ts / range-v3标签,我不允许创建标签,也不能在标题中使用它。
答案 0 :(得分:9)
您只需将结果分配给vector<vector<T>>
,就会发生正确的事情。例如:
#include <vector>
#include <iostream>
#include <range/v3/core.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;
});
std::vector<std::vector<int>> vs = groups; // WORKS
// Display the result: [[0,1,2],[3,4,5],[6,7,8],[9]]
std::cout << ranges::view::transform(vs, ranges::view::all) << std::endl;
}
答案 1 :(得分:3)
假设你正在使用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
可以用函数式的方式使用,但我可能错了,或者事情本来可以改变。第一个假定它可以;第二个不是。 )
这样做首先将惰性范围转换为懒惰的矢量范围。
然后它将懒惰的矢量范围转换为矢量矢量。
这更好(从里到外),因为中间产品是懒惰的&#34;在外面&#34;。可能有一种方法可以从外向内进行,但是懒惰范围的向量必须实际存在,其方式是惰性范围的向量不会。