浅谈c++中的对象比较

我发现在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);
    }
}

如果把代码运行之后,你就会发现排序的规则是很有趣的。

  1. 首先会和第一个元素比较。
  2. 然后再和相邻的元素从右向左比较

如果后一个元素比前一个元素大的话,数组中的顺序不做任何变化,只有当重载小于号返回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的对象比较链接。
传送门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值