由于范围库已经包含在标准中,我一直在玩它一段时间,我对基本概念有一些问题。
我正在努力的玩具示例是:
#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;真的是把东西变成可变/有状态物体的首选方式还是有替代方法?
最佳, 理查德
答案 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";
}