2017-03-29 60 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操作解释为视图<->操作转换,但将其视为修改空容器的操作时,这实际上回答了我的两个问题。问题是关于行为而不是类型的(解释性)问题。 –