在使用set/multiset容器时,容器如果非自己指定(如数据类型、排序规则),默认遵循从小到大的排序规则,今天以set容器为例,介绍如何对自定义数据类型进行降序排序。

毕竟,好记性不如烂笔头。

一、关于set/multiset容器

1、set/multiset,针对简单的成员,比如键(key)值(value)都是int型,容器默认遵循从小到大的升序排序规则

2、set容器不允许存在相同的键、值,而multiset容器则允许;

3、提供默认构造函数、拷贝构造函数、operator=重载函数;

4、提供size()、empty()、swap()方法;

5、提供insert(插入)、erase(删除)、clear(清除)方法;

二、编程需求

举个栗子,我们创建了一个“城堡”(Castle),城堡里配备有“餐厅”、“客厅”、“卧室”、“茅房”,他们的面积分别为235、666、350、999㎡,我们需要把城堡里的配置按面积从大到小排序展示出来,该怎么做?

三、编程思路

1、创建一个“城堡”类(class Castle),里面包含两个public成员变量:建筑名称(string m_Name)、建筑面积(int m_Area),同时提供一个有参构造函数(Castle(string name, int area));

2、类实例化,利用有参构造函数,创建c1("餐厅", 235)、c2("客厅", 666)、c3("卧室", 350)、c4("茅房", 999);

3、创建仿函数,自定义降序排序规则;

4、创建set容器,并利用insert把c1~c4放入容器;

5、利用iterator迭代器,把c1~c4逐一打印输出。

四、敲代码

#include <iostream>
using namespace std;
#include <string>
#include <set>  //包含set容器头文件

//创建castle类
class Castle
{
public:
	Castle(string name, int area)  //提供有参构造函数
	{
		this->m_Name = name;
		this->m_Area = area;
	}
	string m_Name;  //建筑名称
	int m_Area;  //建筑面积
};

//创建降序仿函数(类)
class MyCustom
{
public:
	//重载小括号()
	bool operator()(const Castle& c1, const Castle& c2) const   //注意后面加个const,否则报错
	{
		return c1.m_Area > c2.m_Area;   //按建筑面积降序排序
	}
};

int main()
{
	//利用有参构造函数,创建对象
	Castle c1("餐厅", 235);
	Castle c2("客厅", 666);
	Castle c3("卧室", 350);
	Castle c4("茅房", 999);

	//创建set容器,注意尖括号里面的内容,说明创建的是Castle类对象,同时按指定的方法排序
	set<Castle, MyCustom> ss;

	//insert插入数据,数据插入时,已按照指定的排序规则排序了
	ss.insert(c1);
	ss.insert(c2);
	ss.insert(c3);
	ss.insert(c4);

	//利用iterator迭代器逐一输出
	for (set<Castle, MyCustom>::iterator it = ss.begin(); it != ss.end(); it++)
	{
		cout << "名称:" << (*it).m_Name << " 面积:" << (*it).m_Area << "㎡" << endl;
	}

	system("pause");
	return 0;
}

来看看最后的输出结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55qu55qu54i55Zyw,size_16,color_FFFFFF,t_70,g_se,x_16

完美,哈哈哈。

总结

c++真是学过的编程语言里最难的,学完c++再回头看python,简直就是小儿科。

欢迎大家留言交流,喜欢的话记得三连。

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐