如何迭代 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";
}
}
我是 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";
}
}