2017-07-20 25 views
6

rngというTの範囲があるとします。私はできるでしょうベクトルのベクトルの範囲の範囲

auto groups = ranges::view::group_by(rng, bin_op); 

グループは現在Tの範囲の範囲です。

私もTさんの範囲のベクトルを取得するには、この

auto groups = ranges::view::group_by(rng, bin_op) | ranges::to_vector; 

を行うことができます。しかし、この

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; }; 

明らかに及ぶため、::アクション::(変換動作しませんが)、この場合には、voidを返すと「関数の結果の型は、アクションに渡されます::トランスフォームはソース範囲に書き込み可能に戻されなければなりません "。

どのように私の範囲の範囲をベクターのベクターに変えることができますか?

注:不正なタグは残念ですが、範囲/範囲-ts /範囲-v3タグが見つかりませんでした。作成することはできません。タイトルに使用できませんでした。

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は、関数スタイルで使用することができることを思い出し:あなたと仮定すると

答えて

3

は、ドキュメントの私の読書は私にこのような何かを与え、Rangesv3を使用しています最初のものはそれが可能であると仮定し、2番目のものはそうではないと仮定します)。

これは最初に変換します怠惰な範囲の範囲は、怠惰な範囲のベクトルになります。

次に、遅延した範囲のベクトルをベクトルのベクトルに変換します。

これは、中間製品が「外側に」怠惰であるため、より効果的です(内側に出る)。外部からそれを行う方法があるかもしれませんが、怠惰な範囲のベクトルは実際には存在しなければなりませんは、怠惰な範囲のベクトルにはありません。

+0

実際これは機能します。だから、内部から外部に向かってではなく、内部から外部に向かって作業するのが理想です。他の方向がうまくいかない理由は何ですか? –

+1

@ richかもしれませんが、ベクターが存在し、範囲が怠けているので非効率です。 0のコストに対しては中間のレイジー・ベクトル範囲を持つことができますが、レイジー・レンジの中間ベクトルが存在し、コストが必要です。 – Yakk

+0

それは完全な意味を成しています。私のハスケルの脳が気づかなかったことを恥ずかしい...助けてくれてありがとう。 –

6

結果を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; 
} 
+2

ああ、これは予想よりも簡単です;)私は実際にはドキュメントがもっと奇妙になることを望みます - 私が手に入れないものがたくさん...(近い将来、std :: multimapに関する質問があります) –

関連する問題