C++——set容器的排序与(自定义类型排序)

目标:
 set容器默认排序规则为从小到大,掌握如何改变排序规则
主要技术点:
 利用仿函数,可以改变排序规则

//set容器排序

class MyCompare
{
public:
	bool operator()(int v1,int v2)//仿函数:返回是布尔类型,重载的符号是()
		//第一个小括号表示我重载的符号,第二个小括号表示重载符号这个函数体的参数列表
	{
		return v1 > v2;//做降序排列
	}
};
void test01()
{
	set<int>s1;

	s1.insert(10);
	s1.insert(40);
	s1.insert(20);
//指定排序规则为从大到小
//数据插完的时候就已经按照他所默认的排序规则了,所以想改变他的排序规则需要在创建容器的时候就声明了
	set<int, MyCompare>s1;
//在模版参数列表中是放数据类型的,不能放函数名,所以放仿函数来指定他的规则
}

总结:利用仿函数可以指定set容器的排序规则

2.set容器排序(自定义数据类型)

//set容器排序,存放自定义数据类型
class Person//自定义数据类型
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

class comparePerson//仿函数
{
public:
	bool operator( )(const Person& pl, const Person& p2)
	{
		//按照年龄 降序
		return pl.m_Age > p2.m_Age;
	}
};
void test01()
{
	set<Person, comparePerson>s;

	//创建Person对象
	//自定义数据类型 都会指定排序规则
	Person p1("刘备", 24);
	Person p2("关羽", 28);
	Person p3("张飞", 25);
	Person p4("赵云", 21);

	s.insert(p1);//插入报错
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);

//遍历
    for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "姓名: " << it->m_Name << "年龄: " << it->m_Age << endl;
	}
}

仅个人看视频笔记与理解,如有误可指出谢谢

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,可以使用 `qsort` 函数对一个数组进行排序。而 `qsort` 函数需要一个比较函数来确定元素之间的顺序。如果要对一个自定义结构体的数组进行排序,就需要自定义一个比较函数。 假设我们有一个结构体 `Person`,其中包含姓名和年龄两个成员变量: ```c struct Person { char name[20]; int age; }; ``` 我们想要按照年龄从小到大对一个 `Person` 结构体数组进行排序。那么我们可以自定义一个比较函数如下: ```c int cmp(const void* a, const void* b) { const struct Person *pa = a; const struct Person *pb = b; if (pa->age < pb->age) { return -1; } else if (pa->age > pb->age) { return 1; } else { return 0; } } ``` 其中,`cmp` 函数的参数类型是 `const void*`,这是为了通用性考虑。在函数内部,我们需要将参数转换成 `Person*` 类型,这样才能访问结构体的成员变量。 比较函数的返回值为整型,表示两个元素之间的大小关系。如果返回值为负数,表示第一个元素小于第二个元素;如果返回值为正数,表示第一个元素大于第二个元素;如果返回值为零,表示两个元素相等。 最后,我们可以在主函数中调用 `qsort` 函数来对结构体数组进行排序: ```c int main() { struct Person people[] = { {"Alice", 20}, {"Bob", 18}, {"Charlie", 25}, {"David", 18}, {"Emily", 22}, }; int n = sizeof(people) / sizeof(people[0]); qsort(people, n, sizeof(struct Person), cmp); for (int i = 0; i < n; i++) { printf("%s %d\n", people[i].name, people[i].age); } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值