C++结构体排序个人总结(运算符重定义,比较器)

https://blog.csdn.net/o0roy/article/details/70234241

前几天做蓝桥杯题目有一题有用到结构体排序,刚开始使用比较器,然后sort()排序一下就可以,后来参考别人的代码发现还可以用运算符重定义,着实省事很多,省的再在结构体外面写一个比较器的方法,所以现在总结一下:

第一种:结构体内重定义 (‘  <  ’符号),然后sort就可以排序

    #include"iostream"
    #include"algorithm"
    using namespace std;
    struct Node{
        
        int rank;
        bool operator<(const Node& n)const{//运算符重定义
            return rank < n.rank;// rank > n.rank 降序  rank < n.rank 降序
        }
    }node[3];
    int main(){
     
        int n = 3;
        for(int i = 0;i < n;i++)
            node[i].rank = i;
        
        sort(node,node + n);
        for(int i = 0;i < n;i++)
            cout << node[i].rank << endl;
        
        return 0;
    }

运行结果:升序(降序只需要改成 rank  > n.rank)


第二种:比较器(结构体外定义比较器,然后调用sort时把相应的比较器输入)

    #include"iostream"
    #include"algorithm"
    #include"vector"
    using namespace std;
    struct Node{
     
        int rank;
        bool operator<(const Node& n)const{//运算符重定义
            return rank < n.rank;// rank > n.rank 降序  rank < n.rank 降序
        }
    }node[3];
    bool cmp(Node a,Node b){//比较器写法1
        return a.rank > b.rank;//排序规则同上
    }
    bool cmp_const(const Node& a,const Node& b){//比较器写法2
        return a.rank > b.rank;
    }
    int main(){
     
        int n = 3;
        for(int i = 0;i < n;i++)
            node[i].rank = i;
     
        sort(node, node + n,cmp_const);
        for(int i = 0;i < n;i++)
            cout << node[i].rank << endl;
     
        return 0;
    }

运行结果同上

因为主修的不是C++,所以关于写法1,写法2有什么区别还不清楚,等过两天问老师才知道,但是运行结果一样

写法1,2的区别

为了限定隐含的this指针,
即这个成员函数不能修改其数据成员
一般在类中这样用,这个成员函数的功能多数是get数据成员,即获得对象的某个数据,只读不写相关文章连接


应用:vector排序应用

    #include"iostream"
    #include"algorithm"
    #include"vector"
    using namespace std;
    struct Node{
     
        int rank;
        bool operator<(const Node& n)const{//运算符重定义
            return rank > n.rank;// rank > n.rank 降序  rank < n.rank 降序
        }
    }node[3];
    bool cmp(Node a,Node b){//比较器写法1
        return a.rank > b.rank;//排序规则同上
    }
    bool cmp_const(const Node& a,const Node& b){//比较器写法2
        return a.rank > b.rank;
    }
    int main(){
        vector<Node> v;
        int n = 3;
        for(int i = 0;i < n;i++)
            node[i].rank = i;
     
        for(int i = 0;i < n;i++)
            v.push_back(node[i]);
     
        sort(v.begin(), v.end());//操作符重定义
        //sort(v.begin(), v.end(),cmp);//比较器1
        //sort(v.begin(), v.end(),cmp_const);//比较器2
        for(int i = 0;i < n;i++)
            cout << v[i].rank << endl;
     
        return 0;
    }
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,结构排序练习通常涉及到如何使用标准库中的算法对包含自定义数据类型的结构数组或容进行排序。这里我们可以举一个简单的例子,假设有一个名为`Student`的结构,包含`name`和`age`两个成员: ```cpp struct Student { std::string name; int age; }; ``` 你可以用以下几种方法对`Student`结构数组进行排序: 1. **直接排序:**如果年龄是排序的主要依据,你可以定义一个比较函数(`compare`),然后使用`std::sort`函数: ```cpp bool compareStudents(const Student& s1, const Student& s2) { return s1.age < s2.age; } int main() { Student students[] = {{"Alice", 20}, {"Bob", 18}, {"Charlie", 22}}; std::sort(students, students + sizeof(students) / sizeof(students), compareStudents); // 现在students数组按年龄升序排列 } ``` 2. **使用STL算法:**如果你的结构已经实现了`<`运算符,那么可以直接使用`std::stable_sort`: ```cpp bool studentLess(const Student& s1, const Student& s2) { return s1.age < s2.age; } int main() { std::vector<Student> students = {{"Alice", 20}, {"Bob", 18}, {"Charlie", 22}}; std::stable_sort(students.begin(), students.end(), studentLess); } ``` 3. **自定义比较(C++11及以上):**也可以使用lambda表达式来创建一个可传递的比较: ```cpp int main() { std::vector<Student> students = {{"Alice", 20}, {"Bob", 18}, {"Charlie", 22}}; std::sort(students.begin(), students.end(), [](const Student& s1, const Student& s2) { return s1.age < s2.age; }); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值