sort与priority_queue的重载运算符,以及字符数组形参的传递

文章介绍了如何在C++中实现学生结构体的构造函数,包括可读写和只读的字符数组参数处理。同时,讨论了重载运算符`<`的类内和类外实现,以及在`priority_queue`和`sort`中的使用规则,展示了不同排序逻辑导致的不同输出结果。
摘要由CSDN通过智能技术生成

前提:

学生结构体

实现自定义顺序输出

typedef struct student {
    int grade;
    char name[100];
    int year;
} student;

①重写构造函数-字符数组形参的传递

char* name:可写的

const char* name:只读的

区别:strcpy与strcmp

student(int grade, const char* name,int year) {
        this->grade=grade;
        strcpy(this->name,name);
        this->year=year;
}

②重载运算符

类内重载

1,只能有一个参数,注意const和&

2,参数括号后面加一个const

typedef struct student {
    int grade;
    char name[100];
    int year;
    
    bool operator< (const student &b) const{
        if(this->grade==b.grade) {
            int x=strcmp(this->name,b.name);
            if(x==0) return this->year<b.year;
            else return x>0;
        } else 
            return this->grade>b.grade;
        
    }

} student;

类外重载

1,两个参数,注意const和&

2,友元函数friend

typedef struct student {
    int grade;
    char name[100];
    int year;
    friend bool operator< (const student &a, const student &b);
} student;

bool operator< (const student &a, const student &b) {
    if(a.grade==b.grade) {
        int x=strcmp(a.name,b.name);
        if(x==0) return a.year<b.year;
        else return x>0;
    } else {
        return a.grade>b.grade;
    }
}

③priority_queue中的用法

#include <bits/stdc++.h>
using namespace std;

typedef struct student {
    int grade;
    char name[100];
    int year;
    student(int grade, const char* name,int year){
        this->grade=grade;
        strcpy(this->name,name);
        this->year=year;
    }
} student;

bool operator< (const student &a, const student &b) {
    if(a.grade==b.grade) {
        int x=strcmp(a.name,b.name);
        if(x==0) return a.year<b.year;//year小在后
        else return x>0;//name大在后
    } else {
        return a.grade>b.grade;//grade大则返回true,则<,则优先级低,则在后
    }
}
 
int main() {
    priority_queue<student> q;
    q.push(student(10,"ab",4));
    q.push(student(10,"ac",7));
    q.push(student(10,"ac",2));
    q.push(student(11,"xx",4));
    
    while(!q.empty()){
        student stu=q.top();
        cout<<stu.grade<<" "<<stu.name<<" "<<stu.year<<endl;
        q.pop();
    }
    
}

输出

10 ab 4
10 ac 7
10 ac 2
11 xx 4

④sort的用法

#include <bits/stdc++.h>
using namespace std;

typedef struct student {
    int grade;
    char name[100];
    int year;
    student(int grade, const char* name,int year) {
        this->grade=grade;
        strcpy(this->name,name);
        this->year=year;
    }
    bool operator< (const student &b) const{
        if(this->grade==b.grade) {
            int x=strcmp(this->name,b.name);
            if(x==0) return this->year<b.year;//year小在前
            else return x>0;//name大在前
        } else {
            return this->grade>b.grade;//grade大在前
        }
    }

} student;

int main() {
    student stu[4]={{10,"ab",4},{10,"ac",7},{10,"ac",2},{11,"xx",4}};
    sort(stu,stu+4);
    for(int i=0;i<4;i++){
        cout<<stu[i].grade<<" "<<stu[i].name<<" "<<stu[i].year<<endl;
    }
        
    
    
}

输出

11 xx 4
10 ac 2
10 ac 7
10 ab 4

结论:sort与priority_queue相反

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
priority_queue中对自定义类型进行排序时,可以通过重载运算符来定义比较规则。比如,如果要按照元素值从大到小排序(小顶堆),可以在自定义类型的结构体或类中重载小于运算符(operator<)。例如,定义一个名为MyType的结构体,其中包含一个名为val的整数成员变量,可以重载小于运算符如下: struct MyType { int val; bool operator<(const MyType& other) const { return val > other.val; // 从大到小排序 } }; 然后可以使用以上自定义类型来定义一个priority_queue实例: priority_queue<MyType> pq; 这样,当向priority_queue中插入元素时,会按照自定义的比较规则进行排序。在上述例子中,元素会按照val的值从大到小排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [关于struct自定义类型的set/priority_queue重载运算符](https://blog.csdn.net/weixin_59534651/article/details/123141614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [一文看懂priority_queue自定义比较函数有几种方法](https://blog.csdn.net/weixin_36389889/article/details/129802998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C++ sort / priority_queue自定义比较](https://blog.csdn.net/ahundredmile/article/details/126025258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值