向量矢量的范围范围

时间:2017-07-20 11:08:51

标签: c++ range-v3

假设我有一系列名为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标签,我不允许创建标签,也不能在标题中使用它。

2 个答案:

答案 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;。可能有一种方法可以从外向内进行,但是懒惰范围的向量必须实际存在,其方式是惰性范围的向量不会。