我发现在java和c++的对象排序中,我总是傻傻分不清楚,于是有了这篇博文。
c++中的排序主要是利用sort函数,默认是按照从小到大排序的规则,这也是我们为什么要重载<的理由。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
//c++重载运算符的学习
struct Node{
int id;
int year;
//我想让Node按照id从小到大排序,如果id相同,就按照year从小到大排序
//也就是说这里记录的需要更新的规则,这里一定要和java中的对象排序分开来
bool operator<(const Node &node) const {
cout<<endl;
cout<<this->id<<"-----"<<this->year<<endl;
cout<<node.id<<"------"<<node.year<<endl;
cout<<endl;
bool x= false;
if (id < node.id) x = true;
if (id == node.id) x= year<node.year;
cout<<"返回值--->"<<x<<endl;
return x;
}
Node(int id,int year):id(id),year(year){};
};
vector<Node> nodevector;
int main(){
Node node(0,0), node1(1,2),node2(2,3),node3(3,4),node4(3,5),node5(3,1);
nodevector.push_back(node);
nodevector.push_back(node1);
nodevector.push_back(node2);
nodevector.push_back(node3);
nodevector.push_back(node4);
nodevector.push_back(node5);
for (int i = 0; i < nodevector.size(); ++i) {
printf("%d,,,,,%d\n",nodevector[i].id,nodevector[i].year);
}
sort(nodevector.begin(),nodevector.end());
for (int i = 0; i < nodevector.size(); ++i) {
printf("%d,,,,,%d\n",nodevector[i].id,nodevector[i].year);
}
}
如果把代码运行之后,你就会发现排序的规则是很有趣的。
- 首先会和第一个元素比较。
- 然后再和相邻的元素从右向左比较
如果后一个元素比前一个元素大的话,数组中的顺序不做任何变化,只有当重载小于号返回true的时候,说明后一个元素比前一个元素小,这是才进行更新。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
//c++重载运算符的学习
struct Node{
int id;
int year;
//我想让Node按照id从小到大排序,如果id相同,就按照year从小到大排序
//也就是说这里记录的需要更新的规则,这里一定要和java中的对象排序分开来
Node(int id,int year):id(id),year(year){};
Node(){};
};
Node data[6];
bool cmp(const Node &a, const Node &b){
cout<<endl;
cout<<a.id<<"---"<<a.year<<endl;
cout<<b.id<<"---"<<b.year<<endl;
cout<<endl;
return true;
}
bool cmp1(const Node& a, const Node &b){
cout<<endl;
cout<<a.id<<"---"<<a.year<<endl;
cout<<b.id<<"---"<<b.year<<endl;
cout<<endl;
if (a.id == b.id) return a.year<b.year;
else return a.id<b.id;
}
int main(){
Node node(0,0), node1(1,2),node2(2,3),node3(3,4),node4(3,5),node5(3,1);
data[0] = node;
data[1] = node1;
data[2] = node2;
data[3] = node3;
data[4] = node4;
data[5] = node5;
for (int i = 0; i < 6; ++i) {
cout<<data[i].id<<"---"<<data[i].year<<endl;
}
cout<<"******************************"<<endl;
// sort(data,data+6,cmp);
// for (int i = 0; i < 6; ++i) {
// cout<<data[i].id<<"---"<<data[i].year<<endl;
// }
sort(data,data+6,cmp1);
cout<<"******************************"<<endl;
for (int i = 0; i < 6; ++i) {
cout<<data[i].id<<"---"<<data[i].year<<endl;
}
}
运行代码之后,我们会发现,只有在cmp的返回结果是true的时候,相应的对象顺序才发生变化,如果是false的时候,无任何变化。也就是说如果cmp中只有true时,则相当于逆序,而如果只有false的时候,则相当于什么也没发生。
java的对象排序和c++的对象排序可以总结为:
- compareTo的返回结果为1相当于c++中的false
- compareTo的返回结果为1相当于c++中的true
最后的最后,附上java的对象比较链接。
传送门