【发布时间】:2019-10-23 22:22:10
【问题描述】:
我有一个无符号整数向量的向量。父向量的每个元素都是三个无符号整数的向量。我主要想按子向量的第一个元素的降序对父向量进行排序,但我也想按第三个元素的 升序 顺序对具有相同第一个元素的任何子向量进行排序。我最初使用以下代码进行此操作:
sort(league_vector.begin(), league_vector.end());
reverse(league_vector.begin(), league_vector.end());
sort(league_vector.begin(), league_vector.end(),
[](const std::vector<unsigned int>& a, const std::vector<unsigned int>& b) {return a[0] == b[0] && a[2] < b[2];});
所以只是排序,然后反转,整个事情,这将按第一个元素排序。然后使用 lambda 函数进行自定义排序,该函数仅在第三个元素较小 并且 第一个元素相等时才返回 true。
当我在父向量中的元素数量相对较少(大约 50 个或更少)时,这似乎工作得很好,但是当我有更多的元素时,最终的排序会变得非常混乱,根本没有明显的模式。
我已将其替换为单个自定义排序:
sort(league_vector.begin(), league_vector.end(),
[](const std::vector<unsigned int>& a, const std::vector<unsigned int>& b)
{return ((a[0] > b[0]) || (a[0] == b[0] && a[2] < b[2]));});
因此,当第一个元素较大或第三个元素较小且第一个元素相同时,这将返回 true。这似乎工作正常,所以我只是使用它,但我无法弄清楚第一种方法有什么问题。特别是第一种方法似乎在某些时候有效,而第二种比较无论如何只是第一种比较的扩展。
【问题讨论】:
-
a[0] == b[0] && a[2] < b[2]是否满足严格的弱排序?我认为不会。此外,您的第二个比较器也很奇怪,您在 [0] 上检查 >,但在 [2] 上检查 -
@O'Neil 实际上,这不是问题所在。只有当
a < b && a > b时,不对称才会被打破。如果!(a < b) && !(b < a),那只是意味着两个元素相等。但是,这种比较不尊重不可比性的传递性。 -
文档对此进行了解释,尽管它没有为尚未了解的人详细介绍:cplusplus.com/reference/algorithm/sort
-
@Borgleader 对于您问题的第二部分,这是经过深思熟虑的。我基本上是在对“获胜”的数量进行排名,较高的数字位于列表的顶部。但是,当该数字出现平局时,我希望他们排名第一,所以在这种情况下,它是较低的数字。