如何迭代 range-v3 动作?

How to iterate over a range-v3 action?

我是 range-v3 的新手。我首先编写了一个程序,该程序生成一个整数范围,对其进行修改,然后打印出结果范围。我使用了 actions 库中的修饰符,它使我的代码不可迭代。 有人可以帮助我了解如何将 ranges::action::action_closure 转换为可迭代对象吗?

这是我开始的示例 - 一个生成并打印出一系列数字的函数。此代码工作正常并编译。

void generate_and_print_numbers_using_streams_and_iterators() {
  auto v = views::iota(1, 5);  // <-- this code works fine with streams and iterators.

  // this works
  cout << v << endl;

  //this works too
  for (auto s: v) {
    cout << s << ", ";
  }
  cout << endl;

  // and this works too
  for (auto it = v.begin(); it != v.end(); ++it) {
    cout << *it << ", ";
  }
  cout << endl;
}

然后我试着介绍我提到的动作。此代码不再编译 - v 不再是视图,而是未定义 begin()end() 函数的 action_closure

void generate_and_print_numbers_using_streams_and_iterators() {
  // I REPLACED THIS:
  // auto v = views::iota(1, 5);
  // WITH THIS:
  auto v = action::push_back(views::iota(1, 5)) | actions::unique;  // Wrapped iota in push_back

  // .. the remainder of the function is unchanged

我尝试搜索 ranges-v3 的文档,并使用谷歌搜索此转换。我唯一找到的是 the following article,它显示了如何将视图转换为具体容器(矢量)。

我将不胜感激有关此主题的任何帮助。

Actions 不是 return light-weight 可以像视图操作那样延迟迭代的临时对象。动作急切地应用于实际容器和 return 个实际容器,但仍然可以组合在一起。

下面的 std::vector<int>() 是一个 r-value,它通过 push_back 填充,其中 return 是一个 r-value,然后传递给反向操作.所有这些处理都急切地发生,类似于普通的嵌套函数调用,但使用管道语法:

void do_something_with_a_push_back_action() {
    std::vector<int> vec = std::vector<int>() | 
        ranges::actions::push_back(ranges::views::iota(1, 5)) | 
        ranges::actions::reverse;

    for (int val : vec) {
        std::cout << val << "\n";
    }
}