自定义sort函数第三个参数的规则

本文探讨了C++中使用STL sort函数时遇到的一个具体问题:如何正确实现自定义排序规则。通过对比两个相似的比较函数,揭示了在元素相等条件下的排序规则差异,并提供了修正方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴错误代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

struct stu {
    long id;
    int de;
    int cai;
    int total;
};

vector <stu> a1, a2, a3, a4;

bool cmp_1(const stu& a, const stu& b) {
    return (a.total > b.total || (a.total == b.total && a.de >= b.de)); //注意这句话
}

int main() {
    freopen("E:/VSproject/hdu/hdu1041/Debug/in.txt", "r", stdin);
    int n, l, h, sum = 0;
    cin >> n >> l >> h;
    stu temp;
    for(int i = 0; i < n; i++) {
        cin >> temp.id >> temp.de >> temp.cai;
        temp.total = temp.de + temp.cai;
        //分配
        if(temp.de >= h && temp.cai >= h) 
            a1.push_back(temp), sum++;
        else if(temp.de >= h && temp.cai >= l && temp.cai < h)
            a2.push_back(temp), sum++;
        else if(temp.de >= temp.cai && temp.cai >= l)
            a3.push_back(temp), sum++;
        else if(temp.de >= l && temp.cai >= l) 
            a4.push_back(temp), sum++;
    }
    // 排序
    sort(a1.begin(), a1.end(), cmp_1);
    sort(a2.begin(), a2.end(), cmp_1);
    sort(a3.begin(), a3.end(), cmp_1);
    sort(a4.begin(), a4.end(), cmp_1);
    //显示
    cout << sum << endl;
    for(int i = 0; i < a1.size(); i++) 
        printf("%ld %d %d\n", a1[i].id, a1[i].de, a1[i].cai);
    for(int i = 0; i < a2.size(); i++) 
        printf("%ld %d %d\n", a2[i].id, a2[i].de, a2[i].cai);
    for(int i = 0; i < a3.size(); i++) 
        printf("%ld %d %d\n", a3[i].id, a3[i].de, a3[i].cai);
    for(int i = 0; i < a4.size(); i++) 
        printf("%ld %d %d\n", a4[i].id, a4[i].de, a4[i].cai);
}

主要需要注意的是这句

bool cmp_1(const stu& a, const stu& b) {
    return (a.total > b.total || (a.total == b.total && a.de >= b.de)); //注意这句话
}
这是自定义的比较函数,可编译通过,但是会产生运行错误。
更改的方法:
bool cmp_1(const stu& a, const stu& b) {
    return (a.total > b.total || (a.total == b.total && a.de > b.de));
}
这是在 >= 与 > 可互换的情况下的更改
如果要保持原语义完全不变,可改为如下:
呃呃,没弄出来,换了好多个句子,都不成,是不是它会自动优化我的代码导致最后代码都是一样,但STL的sort()又处理不了 >= 的运算符造成的?
等有时间探究一下。
初步猜测是sort()处理不了 >= 运算符。

转载于:https://www.cnblogs.com/bearcarl/p/9222461.html

### JavaScript `sort` 函数第三个参数及其返回值含义 在 JavaScript 中,`Array.prototype.sort()` 方法用于对数组中的元素进行排序。该方法接受一个可选的比较函数作为参数,此函数定义了排序的顺序[^1]。 然而,标准的 `sort()` 方法仅支持 **最多两个参数** 的比较函数 `(a, b)`,并没有所谓的“第三个参数”。如果提到“第三个参数”,可能是误解或者特定场景下的扩展行为。以下是关于这一话题的具体分析: #### 1. 标准 `sort()` 方法的行为 按照 ECMAScript 规范,`sort()` 方法的工作机制如下: - 如果未提供比较函数,则默认按字符编码顺序排列(即将数组项转换为字符串并按字典序排序)[^3]。 - 提供比较函数时,该函数接收两个参数 `a` 和 `b`,通过它们之间的关系决定排序方式。具体规则为: - 若返回值 `< 0`,则认为 `a` 应排在 `b` 前面; - 若返回值 `= 0`,则保持两者相对位置不变; - 若返回值 `> 0`,则认为 `a` 应排在 `b` 后面。 示例代码展示如何自定义排序逻辑: ```javascript const numbers = [4, 2, 8, 1]; numbers.sort((a, b) => a - b); console.log(numbers); // 输出: [1, 2, 4, 8] ``` #### 2. 关于所谓“第三个参数”的讨论 实际上,在官方文档和规范中并未提及 `sort()` 存在一个额外的“第三个参数”[^5]。如果有开发者声称存在这样的功能,可能源于以下几种情况之一: - 对 API 文档理解错误; - 使用某些库或框架实现了非标准版本的 `sort()` 方法; - 自己封装了一个带有更多选项的高级排序工具。 例如,假设某人创建了一种增强型排序算法允许指定第三甚至更多配置项,这完全取决于个人实现而非内置特性。 #### 3. 返回值的作用范围 无论是否存在假定意义上的“第三个输入变量”,最终由回调函数产生的单一数值始终决定了当前两成员间的优先级对比结果。换句话说,“返回什么就影响着谁先谁后”。 下面是一个例子说明不同类型的输出怎样控制序列调整过程: ```javascript function sortOrder(a, b){ if (typeof a !== typeof b){ return String(a).localeCompare(String(b)); // 不同种类的数据依据字符串形式评估高低 } else{ return a-b; } } let mixedList=[true,"false",null,-7,'9','hello']; mixedList.sort(sortOrder); console.log(mixedList.toString()); //"false,null,true,-7,9,hello" ``` 这里展示了混合类型列表经过定制化处理后的呈现效果[^2]。 --- ### 结论 综上所述,基于现有资料与权威解释,JavaScript 原生 `sort()` 并不存在真正意义上面向用户的“第三个正式参数”设置接口;其核心运作依旧围绕那套经典的双参差额判定法则展开工作。任何超出常规模式的现象均需谨慎对待,并仔细核查实际运行环境是否引入外部干预因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值