使用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;
}
我在代码中涉及了以下几个知识点:
- C++的类的定义和使用,包括构造函数和成员变量的定义。
- 运算符重载:重载了==运算符,使得可以比较两个num_1对象是否相等。
- 函数指针:定义了一个函数指针num_2,用作排序函数的回调函数。
- STL库中的list容器的使用:使用list存储num_1对象,并且使用sort函数排序。
- 迭代器的使用:通过迭代器遍历list容器中的元素,并输出其属性值。