18.8.8 set容器排序
学习目标:
- set容器默认从小到大,掌握如何改变排序规则
主要技术点:
- 利用仿函数,可以改变排序规则
注意:
- set容器默认为从小到大,如果要指定排序规则,要在插入数据之前指定规则。
示例1:内置数据类型
下面的代码中,创建了一个MyCompare类,重载函数调用运算符,并且在创建set容器时用类名作为第二个参数。
#include <iostream>
#include <set>
using namespace std;
class MyCompare1
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test1()
{
//指定排序规则为从大到小
set<int, MyCompare1>s2;
s2.insert(20);
s2.insert(40);
s2.insert(10);
s2.insert(50);
s2.insert(30);
for (set<int, MyCompare1>::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << *it << '\t';
}
cout << endl;
}
int main()
{
test1();
}
示例2:自定义数据类型
这跟内置数据类型原理都相同。
#include <iostream>
#include <set>
#include <sstream>
using namespace std;
class Person
{
public:
Person(string name, int age)
{
this->name = name;
this->age = age;
}
string getInfo() const
{
stringstream temp;
temp << "姓名:" << this->name << "\t年龄:" << this->age;
return temp.str();
}
string name;
int age;
};
class MyCompare2
{
public:
bool operator()(Person p1, Person p2)
{
return p1.age > p2.age;
}
};
void test2()
{
//自定义数据类型都要指定排序规则
set<Person, MyCompare2>s;
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, MyCompare2>::iterator it = s.begin(); it != s.end(); it++)
{
cout << it->getInfo() << endl;
}
cout << endl;
}
int main()
{
test2();
}