You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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的逻辑:

  1. 分组判断:先确认两个元素是否属于「3-6」这个需要移到末尾的集合。
  2. 跨组优先级:如果一个元素属于目标集合,另一个不属于,那么非目标元素必须排在前面——这里用!a_in_target来实现:当a不是目标元素时,返回true,意味着a的排序位置比b更靠前。
  3. 同组排序:如果两个元素属于同一组(要么都在目标集合里,要么都不在),就按照降序规则a > b排序,保证组内的顺序符合要求。

另外提一句:你原来的比较函数return indices[first] > indices[second]其实存在隐患——std::sort执行过程中会不断交换元素位置,此时indices[first]访问的是排序中的vector元素,而非初始值,能得到正确结果其实是巧合。咱们修改后的比较函数直接比较元素本身,才是更安全、符合规范的写法。

内容的提问来源于stack exchange,提问作者Yury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:02:38