前言
关于在结构体中重载运算法这个问题,起初个人也不算太理解,在浏览许多博文之后发现每个人的解释都不大一样。思考许久之后,决定写一下自己的见解。如果差错,欢迎各位指出。
正题
首先,我们看一个结构体person。
struct person
{
double height;
double weight;
double age;
}p[20];
不难看出,在结构体person中,我们定义了三个double变量:height,weight,age。我们就用这个结构体来表示人的一些属性。
person 小明,小刚; //定义出来两个人
看完结构体后,再来看三个表达式:
5
>
3
5>3
5>3
35.2
<
45.6
35.2<45.6
35.2<45.6
小
明
<
小
刚
小明<小刚
小明<小刚
前两个数学表达式在我们看来,十分容易理解。
那么第三个表达式要怎么理解呢?小明的身高小于小刚?小明的体重小于小刚?小明的年龄小于小刚?
因为小明与小刚是人,在我们所熟知的世界中,并没有直接拿两个人直接比较的,比较的只是两个人的某种属性。
那么我们就以年龄为标准,用sort来对peron这个结构体进行排序。
sort(first_pointer,first_pointer+n,cmp);
冷静!sort函数里好像并不能满足我们的意思。那要怎么解决呢?对了,重载!
重载
如果要说重载的话,请读者事先自行了解重载的定义。
请看下图:
一个很明显的重载。
这个可能就比较抽象一点了,为了更好的解释,我便这样构造了一下。
我们回过头来再看一下这个公式
小
明
<
小
刚
小明<小刚
小明<小刚
结合我们的第二幅图,我们就可以通过重载 ‘<’ 让结构体在使用 ‘<’ 进行排序的时候直接找到他要走的那条路。那么我们就可以在结构体重加入重载<的一个函数:
struct person
{
double height;
double weight;
double age;
bool operator<(const person &x) const
{
return age < x.age;
}
}p[20];
此处内容,个人理解,可能会有错误,但是可以帮助你理解这个重载函数:
首先看重载函数是bool类型,那么只有true或false两种取值,当 age < x.age 为true时,函数的返回值也是true。反之为false。(此处的age == this.age)
此时根据重载,用sort(p,p+20)就可以直接排序了,因为这个时候根据图二,我们可以知道 < 直接重载,可以根据person的age属性来进行比较了。
如果把重载函数中的小于号换成大于号
bool operator<(const person &x) const
{
return age > x.age;
}
那么我们是不是就可以认为,此时的 ‘>’ 和 '<'翻转了,大于是小于,小于才是大于。
这个时候,就相当于我们把原来的顺序给逆序了。
再来谈谈 sort 和 priority_queue
先来看一段代码,大致了解一下sort和priority_queue中的默认排列顺序:
int main()
{
int a[10];
int b[10];
priority_queue<int> q;
for(int i=0;i<10;i++){
a[i] = i ;
b[i] = 9 - i ;
q.push(a[i]);
}
//优先队列出队,查看元素排列方式
for(int i=0;i<10;i++){
int t = q.top();
q.pop();
cout<<t<<" ";
}
cout<<endl;
//sort对b[10]排序,查看排列方式
sort(b,b+10);
for(int i=0;i<10;i++){
cout<<b[i]<<" ";
}
return 0;
}
在数组a,b中,他们存储的数据应该是这样的:
a
:
0
1
2
3
4
5
6
7
8
9
a: 0 1 2 3 4 5 6 7 8 9
a: 0 1 2 3 4 5 6 7 8 9
b
:
9
8
7
6
5
4
3
2
1
0
b: 9 8 7 6 5 4 3 2 1 0
b: 9 8 7 6 5 4 3 2 1 0
优先队列中是从a[0]到a[9]依次入队,执行输出后,对比数组a的数据,我们就可以发现他的数据存储是这样的:
a
:
0
1
2
3
4
5
6
7
8
9
a: 0 1 2 3 4 5 6 7 8 9
a: 0 1 2 3 4 5 6 7 8 9
p
r
i
o
r
i
t
y
−
q
u
e
u
e
:
9
8
7
6
5
4
3
2
1
0
priority-queue: 9 8 7 6 5 4 3 2 1 0
priority−queue: 9 8 7 6 5 4 3 2 1 0
可以说优先队列默认是从队头到队尾依次大到小。
那么再对比原数组b来看看sort:
b
:
9
8
7
6
5
4
3
2
1
0
b: 9 8 7 6 5 4 3 2 1 0
b: 9 8 7 6 5 4 3 2 1 0
s
o
r
t
:
0
1
2
3
4
5
6
7
8
9
sort: 0 1 2 3 4 5 6 7 8 9
sort: 0 1 2 3 4 5 6 7 8 9
sort默认把数组按从小到大排序。
其实这就是sort和priority_queue中的默认方式:sort为小顶堆,priority_queue为大顶堆。
sort排序就像体育课站队一样,从前到后,依次从小到大(从低到高)。
priority_queue正如优先一词,能力越高越靠前。
结构体重载了<后使用 sort 和 priority_queue
重载了小于号后我们可以根据重载函数中的表达式来判断大于号和小于号是否翻转。如果没有翻转,那么他们还是默认排序,如果翻转了的话,他们的排序就相反。
至于说重载 > 的问题,看一个表达式你就明白了:
a
>
b
=
=
b
<
a
a>b ==b<a
a>b==b<a
有疑问请看这里
如果您有疑问或发现哪里出错,请在评论区留言。感谢您花费时间读完文章,如果对您有帮助就点赞,评论支持一下吧。