set 存放内置数据类型
注意事项
-
利用仿函数修改 set 的默认排序规则
- 仿函数必须指定成 const,否则会报错,即
bool operator()(int v1, int v2)const
- 仿函数必须指定成 const,否则会报错,即
-
在创建 set 对象时,应该将类名作为第二个参数传递
set<int, MyCompare> myset;
<>
里面存放的应该是数据类型,而例子中的MyCompare
恰好是类
这种数据类型
代码
//set排序
#include<iostream>
#include<set>
using namespace std;
class MyCompare
{
public:
//vs2022中 MyCompare中的operator()必须是 const 成员函数
bool operator()(int v1, int v2)const
{
//降序排列
return v1 > v2;
}
};
void test01()
{
//内置数据类型的排序
//指定排序规则为从大到小(指定规则必须在还没插入数据前才能生效)
set<int, MyCompare>s2;
s2.insert(10);
s2.insert(40);
s2.insert(20);
s2.insert(50);
s2.insert(30);
s2.insert(60);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
return 0;
}
set 存放自定义数据类型
注意事项
- 对于自定义类型,必须使用仿函数指定排序规则
bool operator()(const Person& p1, const Person& p2)const
- 注意要将仿函数指定成
const
类型,否则会报错
- 注意要将仿函数指定成
- 创建 set 对象时,要将仿函数所在的类的类名作为第二个参数传递
set<Person, ComparePerson>s;
代码
#include<iostream>
#include<set>
using namespace std;
class Person
{
public:
string m_Name;
int m_Age;
Person(string name, int age) :m_Name(name), m_Age(age) {}
};
class ComparePerson
{
public:
bool operator()(const Person& p1, const Person& p2)const
{
//按照年龄降序
return p1.m_Age > p2.m_Age;
}
};
void test02()
{
set<Person, ComparePerson>s;
Person p1("刘备", 23);
Person p2("关羽", 27);
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 << "\t" << "年龄:" << it->m_Age << endl;
}
cout << endl;
}
int main()
{
test02();
return 0;
}