list容器中,完成列表的升序降序

17 篇文章 0 订阅

        使用C++的list容器,可以通过调用sort()函数来实现列表的升序排序和降序排序。sort()函数默认使用升序排序,若要实现降序排序,可以使用greater<>()函数作为参数。但如果类型为复杂的自定义类,则还需要自己进行 == 重载和回调函数等操作。

我这里以下面例题讲解:

使用list容器。放入5个人,属性有姓名、身高、体重。

1、按体重的降序排列

2、体重如果相同,按身高的降序排

第一步,创建一个人物类:

class num_1{     //人 模板
    public:
        string name;
        float weight;
        int height;

        num_1(){}
        num_1(string name,int weight,int height)
        {
            this->name = name;
            this->weight = weight;
            this->height = height;
        }
        bool operator==(const num_1 &pp) const // soer 正常情况下只可以排列int类型,所以需要重载 ==
        {
            return this->name == pp.name && this->weight == pp.weight && this->height == pp.height;
        }  //因为sort底层会判断两个int的数的大小,所以我们这里的 == 号要根据我们的类型成员进行重载
};

        学生类里面有姓名、年龄、身高等属性。

第二步,创建 list 容器:

   //初始化对象
    num_1 p1("李达康", 180,173);
    num_1 p2("懒羊羊", 130,178);
    num_1 p3("红太狼", 20,180);
    num_1 p4("喜羊羊", 20,90);
    num_1 p5("灰太狼", 23,91);

    //把3个对象分别从尾放入 list 列表中     
    list<num_1> v;
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

        先声明好5个对象,后分别把三个对象放入list 容器。

第三步 按要求降序

再放一次要求:

1、按体重的降序排列

2、体重如果相同,按身高的降序排

        正常情况下,我们都是可以直接调用如下代码:

v.sort();

        但在本题,不论是他本身的升序还是函数只能判断单一的int类型的数,而我们这里的容器里的数据是组合类型的num_1,所以直接用上面方法一定会出错误。

        所以我们这里需要自己写一个回调函数:

v.sort(num_2);   // soer 正常情况下只可以排列int类型,所以需要重载 == ,num_2是回调函数
bool num_2(num_1 &stu1,num_1 &stu2)    //回调函数
{
    if(stu1.weight == stu2.weight)   //判断,体重相等则按身高降
    {
        return stu1.height > stu2.height;
    }
    else    //判断,正常情况下走else按身高降
    {
        return stu1.weight > stu2.weight;
    }

}

在类中的 == 重载:

bool operator==(const num_1 &pp) const // soer 正常情况下只可以排列int类型,所以需要重载 ==
        {
            return this->name == pp.name && this->weight == pp.weight && this->height == pp.height;
        }  //因为sort底层会判断两个int的数的大小,所以我们这里的 == 号要根据我们的类型成员进行重载
};

        这里需要重载是因为:因为sort底层会判断两个int的数的大小,所以我们这里的 == 号要根据我们的类型成员进行重载

整体代码如下:

#include <iostream>
#include <string>
#include 《list>


class num_1{     //人 模板
    public:
        string name;
        float weight;
        int height;

        num_1(){}
        num_1(string name,int weight,int height)
        {
            this->name = name;
            this->weight = weight;
            this->height = height;
        }
        bool operator==(const num_1 &pp) const // soer 正常情况下只可以排列int类型,所以需要重载 ==
        {
            return this->name == pp.name && this->weight == pp.weight && this->height == pp.height;
        }
};

bool num_2(num_1 &stu1,num_1 &stu2)
{
    if(stu1.weight == stu2.weight)
    {
        return stu1.height > stu2.height;
    }
    else
    {
        return stu1.weight > stu2.weight;
    }

}

int main(void)
{
    num_1 p1("李达康", 180,173);
    num_1 p2("懒羊羊", 130,178);
    num_1 p3("红太狼", 20,180);
    num_1 p4("喜羊羊", 20,90);
    num_1 p5("灰太狼", 23,91);

    list<num_1> v;
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

    v.sort(num_2);   // soer 正常情况下只可以排列int类型,所以需要重载 == ,num_2是回调函数
    for(list<num_1>::iterator a = v.begin();a != v.end();a++)
    {
        cout << "姓名为:" << a->name << "  身高为:" << a->height << "  体重为:" << a->weight << endl;
    }
    return 0;
}

我在代码中涉及了以下几个知识点:

  1. C++的类的定义和使用,包括构造函数和成员变量的定义。
  2. 运算符重载:重载了==运算符,使得可以比较两个num_1对象是否相等。
  3. 函数指针:定义了一个函数指针num_2,用作排序函数的回调函数。
  4. STL库中的list容器的使用:使用list存储num_1对象,并且使用sort函数排序。
  5. 迭代器的使用:通过迭代器遍历list容器中的元素,并输出其属性值。
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值