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;
}