2017-03-29 3 views
0

範囲ライブラリが標準に組み込まれているので、私はしばらくそれを抱いていましたし、非常に基本的な概念にいくつかの問題があります。範囲-v3のシャッフルアクション

#include <iostream> 
#include <range/v3/all.hpp> 
using namespace ranges; 


int main (int argc, char const* argv[]) { 
    auto v = view::iota(1, 10); 
    std::default_random_engine gen; 
    auto t = action::push_back(view::iota(0, 10)) | action::shuffle(gen); 
    std::cout << t << "\n"; 
} 

それはtが本当に適切な範囲ではないことを私に示唆しての印刷可能な種類のものであるという事実:私は苦労しています

おもちゃの例がこれです。残念ながら、ドキュメンテーション(存在する場合)は実際に自動車を乱用するので、何が起こっているのか分かりません。私は何をしなければならないのですか?(そして、誰かが知っている場合は、結果の型はどのように文書化されますか?(プロキシオブジェクトとオートはうまく混ざりません。 ))。

私の2番目の質問はcargo-culted action :: push_backに関連しています。私がそれを省略すると、アイオタ生成ビューが変更可能である必要があるという概念エラーが出る。明らかにビューは設計上変更不可能なので、ここで問題が発生しますが、実際には変更可能な/ステートフルなオブジェクトに物を持ち上げるための好ましい方法はありませんか、あるいは選択肢がありますか?

ベスト、 リチャード

+0

私は範囲ライブラリを使用しませんが、iamもそれに興味があります:)あなたはコンパイラ診断を入力できますか?反復子は遅れて作成されます。したがって、ビュー:: iotaをシャッフルすることはできません。なぜなら、データはベクトルのように存在しないからです。あなたはview :: iotaからベクトルを生成しようとしましたが、それをシャッフルしましたか? –

+0

push_backはそれを正確に実行しています。私はそれが標準的な方法であるかどうか疑問に思っていました。範囲ライブラリの背後にあるアイデアは、通常ストリーム/ストリーム融合と呼ばれるものです。ある時点(うまくいけば終わり)に現れて現れて(現実に実行している)、目覚めのステップがあるまで、あなたは怠惰なコンテナで作業します。症状発現は通常、何倍か何らかのコピーを用いて行われる。 :: push_backは後者にとって(主観的に)奇妙な選択であるようです。それで私の2番目の質問。最終的に私は行動を間違って解釈していたので、カレスの答えが本当に助けになったのです。 –

+1

アクションは、ビューではなくコンテナで動作します。 'iota_view'コンクリートを作成する必要があります。 'to_vector'を使って'シャッフル 'に渡します。 ['auto container = view :: iota(1、10)|を試してみてください。 to_vector |アクション::シャッフル(ジェネラル); '](https://wandbox.org/permlink/mQBa6v6szm5XnZ7j)。 – Casey

答えて

3

あなたtインスタンスは、アクション、しない範囲です。それが<<できない主な理由です。

これは、複数のコンテナに適用すると分かります。

#include <iostream> 
#include <experimental/iterator> 
#include <range/v3/all.hpp> 
using namespace ranges; 


int main (int argc, char const* argv[]) { 
    std::default_random_engine gen; 
    auto t = action::push_back(view::iota(0, 10)) | action::shuffle(gen); 
    auto v1 = std::vector<int>{} | t; 
    auto v2 = std::vector<int>{} | t; 
    auto v3 = std::vector<int>{} | t; 
    auto v4 = std::vector<int>{} | t; 
    std::copy(v1.begin(), v1.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
    std::copy(v2.begin(), v2.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
    std::copy(v3.begin(), v3.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
    std::copy(v4.begin(), v4.end(), std::experimental::make_ostream_joiner(std::cout, ", ")); 
    std::cout << "\n"; 
} 
+0

'{}'の 'std :: vector ' –

+0

のあとにあなたがいなくなったと思います!私はpush_backアクションをビュー<->アクション変換と解釈しましたが、空のコンテナを変更するアクションとして見ると、これは実際に私の質問の両方に答えています。この問題は、行動ではなく、(解釈的な)視点の問題であった。 –