范围-v3中的随机动作

时间:2017-03-29 09:55:44

标签: c++ c++14 range-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代理对象和自动混合不好 - 请参见Eigen库一个例子))。

我的第二个问题与货物违规行为有关:: push_back。如果我省略它,我会收到一个概念错误,告诉我iota生成的视图需要是可变的。显然,一个视图是设计不可变的,所以我在这里得到了问题,但是&#34;什么都不推。&#34;真的是把东西变成可变/有状态物体的首选方式还是有替代方法?

最佳, 理查德

1 个答案:

答案 0 :(得分: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";
}