set容器修改排序规则以及代码附送详细讲解

文章讲述了在C++中如何使用自定义类型作为set容器的元素,并通过重载运算符()创建仿函数来定制排序规则。当元素是自定义类时,需要提供比较函数,这里使用了友元函数来访问类的私有成员。示例代码展示了如何按照Person类的num属性进行升序排序。
摘要由CSDN通过智能技术生成

set容器的特性就是所有元素都会根据元素的键值自动被排序,set的元素既是元素又是实质。

set中不允许俩个元素有相同的键值,也就是当你输入俩个相同的元素时它只会录入一个。

ser容器是一个只读迭代器,不允许修改内容。(原因大致是因为它会自动排序你输入的元素,当你修改迭代器后它原来的值就会被破坏,它排序的方法就是数据结构中的平衡二叉树排序)

重点:当你自定义类型作为容器的参数的时候,需要修改排序规则,这个规则需要放在<>中,我们又知道<>里面都是类型,规则又是函数,这时我们自然会想到仿函数(重载()运算符),写一个类里面时bool类型函数重载();{这里又是一个易错点就是当重载是引用、在类中、在结构体中都需要加const,具体的由于我也不太理解,反正就记住是加const,我的建议是都加const不用区分情况}

/这其实涉及到一个友元的点,就是一个类作为另一个类的友元时需要掌握的顺序
//例如A作为B的友元
//第一步就是在开头声明B第二步是写B类,但是B类成员函数的实现是放在最后面实现的
//第三步是写B类,第四步是实现A类

下面就是代码情况

#include<set>
class Person;
class My
{
public:
	bool operator()(const Person v1,const Person v2)const;
};
class Person
{
	friend  My;
public:
	int num;
	string name;
	Person() { cout << "无参构造" << endl; }
	Person(int num, string name)
	{
		this->num = num;
		this->name = name;
	}
};

需改排序规则:

bool My::operator()(const Person v1,const Person v2)const
{
	return v1.num < v2.num;
 }

输出函数:

void printfset(set<Person, My>&v)
{
	set<Person, My>::iterator it = v.begin();
	for (; it != v.end(); it++)
	{
		cout << (*it).name << "  " << (*it).num << endl;
	}
}

函数主体:

void text13()
{
	set<Person,My>v;
	v.insert(Person(1, "qq"));
	v.insert(Person(2, "ww"));
	v.insert(Person(3, "ee"));
	v.insert(Person(4, "rr"));
	v.insert(Person(5, "tt"));
	printfset(v);
}

全部函数:

#include<set>
class Person;
class My
{
public:
	bool operator()(const Person v1,const Person v2)const;
};
class Person
{
	friend  My;
public:
	int num;
	string name;
	Person() { cout << "无参构造" << endl; }
	Person(int num, string name)
	{
		this->num = num;
		this->name = name;
	}
};
//这有一个点就是当set中为自定义类型时需要修改排序规则
//当用到引用时需要加const(这个原因我还没搞懂,在线等)
bool My::operator()(const Person v1,const Person v2)const
{
	return v1.num < v2.num;
 }
void printfset(set<Person, My>&v)
{
	set<Person, My>::iterator it = v.begin();
	for (; it != v.end(); it++)
	{
		cout << (*it).name << "  " << (*it).num << endl;
	}
}
void text13()
{
	set<Person,My>v;
	v.insert(Person(1, "qq"));
	v.insert(Person(2, "ww"));
	v.insert(Person(3, "ee"));
	v.insert(Person(4, "rr"));
	v.insert(Person(5, "tt"));
	printfset(v);
}
int main()
{
	text13();
   
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值