如何修改std::sort比较函数实现指定规则的向量降序排序
解决思路:通过自定义比较函数实现分组排序
嘿,这个需求咱们可以直接在一次std::sort里搞定,不用额外再调用排序。核心就是给元素分两组,让非3、4、5、6的元素排在前面,这组内部保持降序;3-6的元素排在末尾,这组内部也保持降序。
修改后的完整代码
#include <vector> #include <algorithm> #include <iostream> int main() { std::vector<int> indices; for (int i = 0; i < 15; i++) indices.push_back(i); // 自定义比较函数实现分组+降序 std::sort(indices.begin(), indices.end(), [](int a, int b) { // 判断当前元素是否属于要移到末尾的3-6区间 bool a_in_target = (a >= 3 && a <= 6); bool b_in_target = (b >= 3 && b <= 6); // 跨组比较:非目标元素优先级更高,排在前面 if (a_in_target != b_in_target) { return !a_in_target; // 当a不是目标元素时,a应该排在b前面,返回true } // 同组内比较:保持降序排列 return a > b; }); // 输出验证结果 for (int num : indices) { std::cout << num << " "; } // 输出结果:14 13 12 11 10 9 8 7 2 1 0 6 5 4 3 return 0; }
比较函数逻辑详解
咱们拆解一下这个lambda的逻辑:
- 分组判断:先确认两个元素是否属于「3-6」这个需要移到末尾的集合。
- 跨组优先级:如果一个元素属于目标集合,另一个不属于,那么非目标元素必须排在前面——这里用
!a_in_target来实现:当a不是目标元素时,返回true,意味着a的排序位置比b更靠前。 - 同组排序:如果两个元素属于同一组(要么都在目标集合里,要么都不在),就按照降序规则
a > b排序,保证组内的顺序符合要求。
另外提一句:你原来的比较函数return indices[first] > indices[second]其实存在隐患——std::sort执行过程中会不断交换元素位置,此时indices[first]访问的是排序中的vector元素,而非初始值,能得到正确结果其实是巧合。咱们修改后的比较函数直接比较元素本身,才是更安全、符合规范的写法。
内容的提问来源于stack exchange,提问作者Yury
相关产品推荐
相关产品推荐

