由于范围库已经包含到标准中了,所以我花了一段时间来讨论它,并且我对一些非常基本的概念有一些问题。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