c++primer
关于重载函数和重载运算符的解释:
- 当运算符运用于类类型
struct、class
的对象时,c++语言允许进行新的定义,即重载运算符。 - 重载的运算符是特殊名字的函数:他们的名字由关键字
operator
和其后要定义的运算符号共同组成。和其他函数一样,重载的运算符也包含返回值类型、参数列表以及函数体。 - 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数。对于二元运算符来说,左侧的运算对象传递给第一个参数,而右侧运算对象传递给第二个参数。
- 如果有一个运算符函数是成员函数,则它的第一个(左侧)运算对象绑定到隐式的
This
指针上。因此,成员运算符函数的(显式)参数数量比总的运算对象总数少一个。
sort函数的参数
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
sort函数一共有三个,默认的comp的sort函数是升序排序的。这个比较函数可以自己写
重载小于号的排序
结构体重重载小于号
struct Rec
{
int l, r;
bool operator< (const Rec& v) const
{
return r < v.r;
}
}v[N];
- 在类中将成员函数修饰为const表示在该函数体内,不能修改对象的数据成员,而且也不能调用非const函数
- const修饰函数参数是为了防止传入的参数代表的内容在函数体内被改变,这仅对 指针和引用有意义。
结构体重载小于号和结合优先队列
struct Rec
{
int l, r;
bool operator< (const Rec& v) const
{
return r < v.r;
}
};
priority_queue<Rec> q;
sort 默认从小到大排列,优先队列默认从大到小;
大根堆重载小于号;小根堆从在大于号,这个先mark一下,还不知道为什么
这里可以直接使用sort函数:sort(v, v + m)
直接写cmp,给sort传参数
bool cmp(Rec& a, Rec& b)
{
return a.r < b.r;
}
注意:这里的返回值类型一定要写bool,不要写int,bool规范,容易理解
注意:这里的返回值类型一定要写bool,不要写int,bool规范,容易理解
注意:这里的返回值类型一定要写bool,不要写int,bool规范,容易理解
这里使用sort(v, v + m, cmp);进行排序
练习题
才华与德行
重载小于号
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, L, H;
struct Person
{
int id, moral, talent;
int level;
int total() const
{
return moral + talent;
}
bool operator< (const Person &t) const
{
if (level != t.level) return level < t.level;
if (total() != t.total()) return total() > t.total();
if (moral != t.moral) return moral > t.moral;
return id < t.id;
}
}p[N];
int main()
{
scanf("%d%d%d", &n, &L, &H);
int m = 0;
for (int i = 0; i < n; i ++ )
{
int id, moral, talent;
scanf("%d%d%d", &id, &moral, &talent);
if (moral < L || talent < L) continue;
int level;
if (moral >= H && talent >= H) level = 1;
else if (moral >= H && talent < H) level = 2;
else if (moral < H && talent < H && moral >= talent) level = 3;
else level = 4;
p[m ++] = {id, moral, talent, level};
}
sort(p, p + m);
printf("%d\n", m);
for (int i = 0; i < m; i ++ )
printf("%08d %d %d\n", p[i].id, p[i].moral, p[i].talent);
return 0;
}
构造cmp
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 100010;
struct Person
{
int de,cai;
string id;
void output()
{
printf("%s %d %d\n",id.c_str(),de,cai);
}
};
int n,l,h;
vector<Person>sheng,jun,yu,xiao;
bool cmp(Person a,Person b)
{
if(a.de+a.cai==b.de+b.cai)
{
if(a.de==b.de)return a.id<b.id;
return a.de>b.de;
}
return a.de+a.cai>b.de+b.cai;
}
int main()
{
scanf("%d %d %d",&n,&l,&h);
for(int i = 0;i<n;i++)
{
char idd[11];
int d,c;string id;
scanf("%s %d %d",idd,&d,&c);
id = idd;
Person p = {d,c,id};
if(d>=l&&c>=l)
{
if(d>=h&&c>=h)sheng.push_back(p);
else if(c<h&&d>=h)jun.push_back(p);
else if(c<h&&d<h&&d>=c)yu.push_back(p);
else xiao.push_back(p);
}
}
sort(sheng.begin(),sheng.end(),cmp);
sort(jun.begin(),jun.end(),cmp);
sort(yu.begin(),yu.end(),cmp);
sort(xiao.begin(),xiao.end(),cmp);
cout<<sheng.size()+jun.size()+yu.size()+xiao.size()<<endl;
for(auto p:sheng)p.output();
for(auto p:jun)p.output();
for(auto p:yu)p.output();
for(auto p:xiao)p.output();
return 0;
}
如果大家有相似用到自定义的排序的题,希望大家加到里面来,做一个题集