c++ - C++20 比较两个惰性排序范围
问题描述
问题
我有两个范围,称它们v,w
以给定的方式排序并且可以进行比较(称为 order 关系T
)。我想按字典顺序比较它们,但是在以不同的方式对它们进行排序之后(称为其他顺序关系S
)。为此,我真的不需要对范围进行完全排序:我只需要懒惰地评估排序向量上的元素,直到找到不同之处。例如,如果v
这个新顺序中的最大值大于 的最大值w
,那么我只需要在有序向量中查找一次。在最坏的情况下,v == w
我会查找所有元素。
我知道 C++20std::ranges::views
允许我获得只读视图,v
并且w
是懒惰地评估的。是否可以获得仍然延迟评估的自定义排序视图?如果我能够定义一些伪代码,例如
auto v_view_sorted_S = v | std::views::lazily_sort();
auto w_view_sorted_S = w | std::views::lazily_sort();
然后我可以简单地调用std::ranges::lexicographical_compare(v_view_sorted_S, w_view_sorted_S)
.
如何实现这一点?
会简单地打电话std::ranges::sort(std::views::all(v))
工作吗?从某种意义上说,它会接受视图而不是实际范围,更重要的是懒惰地评估视图吗?我从对这个问题的回复的评论中得到,在某些条件下std::ranges::sort
可以应用于视图,甚至是转换的视图。但我怀疑它会在通话时对它们进行分类,是这样吗?
我希望它使用的情况:
我对任何示例都感兴趣,但我拥有的非常特殊的用例如下。这与问题无关,但有助于将其置于上下文中
结构v
和w
形式
std::array<std::vector<unsigned int>,N> v;
哪里N
是编译时常量。此外,对于每个0 <= i < N
,v[i]
保证不增加。由此获得的任何两个有序数组的字典顺序就是我T
上面所说的。
我感兴趣的是通过以下规则比较它们:给定一个条目a = v[i][j]
和b = v[k][l]
with0 <= i,k < N
和j,l >= 0
。然后声明a > b
该关系是否a == b
为无符号整数或无符号整数和i < k
。
在订购了该订单的所有条目之后v
,w
我想按字典顺序比较它们。
例如,如果和v = {{2,1,1}, {}, {3,1}}
, 那么。w = {{2,1,0}, {2}, {3,0}}
z = {{2,1,0}, {3}, {2,0}}
z > w > v
解决方案
推荐阅读
- php - Woocommerce 店面主题删除购物车页面和结帐上的“可配送”文本
- bash - Why does redirection in `< /dev/urandom tr | tr` work; how does this parse?
- facebook - 如何获取我网站上某个页面的 Facebook 评论
- c++ - 如何使用正确的时区从 XTS 索引中获取数字时间?
- playframework - JPA & Ebean DDL,使用@ElementCollection 注解时如何正确生成id?
- swift - 注册屏幕不会成功切换到新的视图控制器。
- bash - ROS 动力学中的豺狼模拟 - 得到错误:bash:cd:jackal_ws:没有这样的文件或目录
- python - 如何在单独的行上打印列表中的值?必须使用 for 语句。
- visual-c++ - Visual Studio (2017) 构建工具 150
- apache-kudu - Can I add more than 300 columns in Apache Kudu?