首页 > 解决方案 > 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可以应用于视图,甚至是转换的视图。但我怀疑它会在通话时对它们进行分类,是这样吗?

我希望它使用的情况:

我对任何示例都感兴趣,但我拥有的非常特殊的用例如下。这与问题无关,但有助于将其置于上下文中

结构vw形式

std::array<std::vector<unsigned int>,N> v;

哪里N是编译时常量。此外,对于每个0 <= i < Nv[i]保证不增加。由此获得的任何两个有序数组的字典顺序就是我T上面所说的。

我感兴趣的是通过以下规则比较它们:给定一个条目a = v[i][j]b = v[k][l]with0 <= i,k < Nj,l >= 0。然后声明a > b该关系是否a == b为无符号整数或无符号整数和i < k

在订购了该订单的所有条目之后vw我想按字典顺序比较它们。

例如,如果和v = {{2,1,1}, {}, {3,1}}, 那么。w = {{2,1,0}, {2}, {3,0}}z = {{2,1,0}, {3}, {2,0}}z > w > v

标签: c++sortingc++20

解决方案


推荐阅读