2017-03-29 61 views
0

由於範圍庫已經包含到標準中了,所以我花了一段時間來討論它,並且我對一些非常基本的概念有一些問題。shuffle action in ranges-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是不是一個真正的適當的範圍內的事實。不幸的是,文檔(如果有的話)真的濫用汽車,所以我不知道發生了什麼。我必須做什麼,爲什麼我必須這樣做(以及如果有人知道:結果類型如何記錄(imo代理對象和auto不能很好地混合 - 請參閱Eigen庫作爲示例))。

我的第二個問題是與貨運行動:: push_back有關。如果我忽略它,我會收到一個概念錯誤,告訴我iota生成的視圖需要可變。很顯然,一個視圖在設計上是不可變的,所以我在這裏得到了這個問題,但是「無所作爲」真的是將事物提升爲可變/有狀態對象的首選方式,還是有其他選擇?

最佳, 理查德

+0

我不使用範圍庫,但iam也對它感興趣:)你能輸入編譯器診斷嗎? AFAIK迭代器是懶洋洋地創建的。所以它可能是你不能洗視圖:: iota,因爲數據不像向量中那樣存在。你有沒有嘗試從view :: iota生成一個矢量,然後洗牌? –

+0

push_back正是這樣做的。我只是想知道這是否是規範的做法。範圍庫背後的想法就是通常所說的流/流融合。你在懶惰的容器上工作,直到某個時刻(希望結束)有一個表現步驟(實際執行和寫入)。表現通常使用一些摺疊或一些副本來完成。 :: push_back似乎是後者的(主觀)怪異選擇。因此我的第二個問題。最終我錯誤地解釋了行爲,這就是爲什麼Caleth的答案真的有幫助。 –

+1

操作在容器上操作,而不是視圖。你需要讓你的'iota_view'具體化 - 例如在傳遞給'shuffle'之前使用'to_vector'。 [嘗試'auto container = view :: iota(1,10)| to_vector |動作::洗牌(GEN);'](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操作解釋爲視圖<->操作轉換,但將其視爲修改空容器的操作時,這實際上回答了我的兩個問題。問題是關於行爲而不是類型的(解釋性)問題。 –