zl程序教程

您现在的位置是:首页 >  其他

当前栏目

list容器之排序案例

2023-09-14 09:02:34 时间

案例描述:

  1. 将per类型进行排序,per属性中有姓名,年龄,身高,体重
  2. 排序规则:按照年龄进行升序排列,如果年龄相同按照身高进行降序排列,如果身高相同按照体重进行升序排列

源码如下:

#include<iostream>
using namespace std;
#include<list>
#include<string>
class  per 
{
public:
	per(string name, int age, int height,int weight);
	int age;
	string name;
	int height;
	int weight;
};
//有参构造函数初始化
per::per(string name, int age, int height, int weight) 
{
	this->name = name;
	this->age = age;
	this->height = height;
	this->weight = weight;
}
//指定排序规则的函数声明
bool  comparePerson(per& p1, per& p2);
//打印函数声明
void print(list<per>& person);
//创建相关per类型对象,并放入list容器中,排序然后输出最后结果
void headWork()
{
	per p1("一",18,170,120);
	per p2("二", 19, 174, 130);
	per p3("三", 18, 175, 140);
	per p4("四", 20, 178, 125);
	per p5("五", 23, 180, 135);
	per p6("六", 20, 178, 120);
	list<per> person = {p1,p2,p3,p4,p5,p6};
	//对list容器中自定义类型元素进行排序
	person.sort(comparePerson);
	//排完序后打印
	print(person);
}
//指定排序规则
bool  comparePerson(per& p1,per& p2)
{
	//排序规则:按照年龄进行升序排列,如果年龄相同按照身高进行降序排列,如果身高相同按照体重进行升序排列
	if (p1.age == p2.age)
	{
		if (p1.height == p2.height)
		{
			return p1.weight < p2.weight;
		}
		else 
		{
			return p1.height > p2.height;
		}
	}
	else 
	{
		return p1.age < p2.age;
	}
}
//打印函数
void print(list<per>& person)
{
	for (list<per>::iterator it = person.begin(); it != person.end(); it++)
	{
		cout << "姓名:  " << (*it).name << "  年龄:  " << (*it).age << "  身高:  " << (*it).height << "  体重: " << (*it).weight << endl;
	}
}
int main()
{
	headWork();
	system("pause");
	return 0;
}

在这里插入图片描述

注意问题:

  1. 排序规则需要自己去写,详情看制定规则的函数代码
  2. list容器是双端循环容器,不支持随机跳跃访问,不能用[]和at方式的访问
  3. 因为标准算法库里面的sort排序函数只支持可以随机跳跃访问的容器,因此list内部有自己的一套sort排序函数,无需添加标准算法头文件,通过对象名访问