1. 基本概念
包含头文件:#include <set> //set和multiset一样
自动排序!
P.S. 对于自定义的数据类型,要指定排序规则(使用仿函数)
2. 构造函数
3. 大小和交换
set不能resize。
4. 插入和删除
无法在指定位置插入数据,因为set会默认进行排序。
5. 查找和统计
6. set和multiset 区别
7. pair对组创建
pair<string, int> p1 = make_pair("Jerry", 20);
pair<string, int> p2("Jerry", 20);
cout << "name: " << p1.first << " age: " << p1.second << endl;
8. set容器排序
利用仿函数修改set的排序规则。
仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。
仿函数是定义了一个含有operator()成员函数的类,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,是一个函数对象,它将函数作为参数传递的方式来使用。调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。
仿函数的优缺点:
优点:
1)仿函数比函数指针的执行速度快,函数指针时通过地址调用,而仿函数是对运算符operator进行自定义来提高调用的效率。
2)仿函数比一般函数灵活,可以同时拥有两个不同的状态实体,一般函数不具备此种功能。
3)仿函数可以作为模板参数使用,因为每个仿函数都拥有自己的类型。
缺点:
1)需要单独实现一个类。
2)定义形式比较复杂。
仿函数的作用:
1)作为排序规则,在一些特殊情况下排序是不能直接使用运算符<或者>时,可以使用仿函数。
2)作为判别式使用,即返回值为bool类型。
3)同时拥有多种内部状态,比如返回一个值得同时并累加。
4)作为算法for_each的返回值使用
示例:仿函数用作排序规则
class KCompare //仿函数指定排序规则
{
public:
bool operator()(int v1, int v2) //重载()运算符
{
return v1 > v2;
}
};
void test05()
{
set<int, KCompare> s1;
s1.insert(10);
s1.insert(70);
s1.insert(50);
s1.insert(20);
s1.insert(30);
s1.insert(200);
for (set<int, KCompare>:: iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}