由於範圍庫已經包含到標準中了,所以我花了一段時間來討論它,並且我對一些非常基本的概念有一些問題。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生成的視圖需要可變。很顯然,一個視圖在設計上是不可變的,所以我在這裏得到了這個問題,但是「無所作爲」真的是將事物提升爲可變/有狀態對象的首選方式,還是有其他選擇?
最佳, 理查德
我不使用範圍庫,但iam也對它感興趣:)你能輸入編譯器診斷嗎? AFAIK迭代器是懶洋洋地創建的。所以它可能是你不能洗視圖:: iota,因爲數據不像向量中那樣存在。你有沒有嘗試從view :: iota生成一個矢量,然後洗牌? –
push_back正是這樣做的。我只是想知道這是否是規範的做法。範圍庫背後的想法就是通常所說的流/流融合。你在懶惰的容器上工作,直到某個時刻(希望結束)有一個表現步驟(實際執行和寫入)。表現通常使用一些摺疊或一些副本來完成。 :: push_back似乎是後者的(主觀)怪異選擇。因此我的第二個問題。最終我錯誤地解釋了行爲,這就是爲什麼Caleth的答案真的有幫助。 –
操作在容器上操作,而不是視圖。你需要讓你的'iota_view'具體化 - 例如在傳遞給'shuffle'之前使用'to_vector'。 [嘗試'auto container = view :: iota(1,10)| to_vector |動作::洗牌(GEN);'](https://wandbox.org/permlink/mQBa6v6szm5XnZ7j)。 – Casey