c++ - 将范围的范围连接到范围
问题描述
让rw = ranges::views
.
我正在尝试使用range-v3
构造的模拟来专门创建:
std::vector<int> v;
// range = {0, 1, 2}
auto range = rw::ints (0, 3);
for (int i : range)
for (int j : range)
v.push_back (func (i, j))
// v = {func (0, 0), func (0, 1), func (0, 2),
// func (1, 0), func (1, 1), func (1, 2),
// func (2, 0), func (2, 1), func (2, 2)}
我尝试了以下选项:
// range = {0, 1, 2}
auto range = rw::ints (0, 3);
// range_of_ranges = {{func (0, 0), func (0, 1), func (0, 2)},
// {func (1, 0), func (1, 1), func (1, 2)},
// {func (2, 0), func (2, 1), func (2, 2)}}
auto range_of_ranges = rw::transform (range, [] (int i) {
return rw::transform (range, [i] (int j) { return func (i, j); });
});
// result = {func (0, 0), func (0, 1), func (0, 2),
// func (1, 0), func (1, 1), func (1, 2),
// func (2, 0), func (2, 1), func (2, 2)}
auto result = rw::concat (range, range, range);
for (auto x : result)
printf ("%d\n", x);
但如果我更换
// result = {func (0, 0), func (0, 1), func (0, 2),
// func (1, 0), func (1, 1), func (1, 2),
// func (2, 0), func (2, 1), func (2, 2)}
auto result = rw::concat (range, range, range);
和
// result = { {{func (0, 0), func (0, 1), func (0, 2)},
// {func (1, 0), func (1, 1), func (1, 2)},
// {func (2, 0), func (2, 1), func (2, 2)}} }
auto result = rw::concat (range_of_ranges);
会有一个编译器警告:
warning: format specifies type 'int' but the argument has type 'ranges::iota_view<int, int>' [-Wformat]
printf ("%d\n", x);
不幸的是,它不起作用,我真的不明白如何正确修复它。我知道 concat 函数应该接受它的参数并将它们组合成一个范围,我刚刚创建了一个长度为 1 的范围,但我不知道哪种解决方案是正确的。你能给我一个提示吗?
UPD[1](基于Jarod42评论:range-v3
has views::cartesian_product
):结果将代码简化为以下内容:
auto range = rw::ints (0, 3);
auto cart_prod = rw::cartesian_product (range, range);
auto unpack_args_and_call_func = [] (const auto &arg) {
return std::apply (func, arg);
};
auto result = rw::transform (cart_prod, unpack_args_and_call_func);
但是,使用 unpacking 参数看起来不是很好和方便。
UPD[2](基于Jarod42评论:There are also views::join
for your range_of_ranges
):替换
// result = {func (0, 0), func (0, 1), func (0, 2),
// func (1, 0), func (1, 1), func (1, 2),
// func (2, 0), func (2, 1), func (2, 2)}
auto result = rw::concat (range, range, range);
和
// result = { {{func (0, 0), func (0, 1), func (0, 2)},
// {func (1, 0), func (1, 1), func (1, 2)},
// {func (2, 0), func (2, 1), func (2, 2)}} }
auto result = rw::join (range_of_ranges);
解决方案
感谢Jarod42。
// range = {0, 1, 2}
auto range = rw::ints (0, 3);
// range_of_ranges = {{func (0, 0), func (0, 1), func (0, 2)},
// {func (1, 0), func (1, 1), func (1, 2)},
// {func (2, 0), func (2, 1), func (2, 2)}}
auto range_of_ranges = rw::transform (range, [] (int i) {
return rw::transform (range, [i] (int j) { return func (i, j); });
});
// result = {func (0, 0), func (0, 1), func (0, 2),
// func (1, 0), func (1, 1), func (1, 2),
// func (2, 0), func (2, 1), func (2, 2)}
auto result = rw::join (range_of_ranges);
for (auto x : result)
printf ("%d\n", x);
推荐阅读
- c++ - 如何覆盖我的项目中的柯南共享选项?
- visual-studio-code - 是否可以在 Linux 中使用 vscode-car-plugin 创建 .car 文件?
- webpack - 如何解决这个问题:gulp-inject 没有注入 _custom.scss 和 portal_normal.ftl
- bash - 如何将具有多个标志的字符串分配给可在命令中重用的变量?
- javascript - 复选框起作用,但没有动画
- json - 在 Julia 中使用类似 JSON 的结构遍历嵌套字典
- python - 从 Python 类生成 JSON 模式规范
- java - 为什么我的年度闹钟无法正常工作?
- jquery - Bootsrap 模态 iframe 未显示
- python - 如何将 dl.Overlay 与多个输入一起使用?