set容器自定义排序

仿函数

仿函数(functor),就是使一个类的使用看上去像一个函数。就是类中实现一个operator(),这个类就有了类似函数的行为。

要使用STL内建的仿函数,必须包含<functional>头文件。而头文件中包含的仿函数分类包括

  1. 算数类仿函数
  • 加:plus\
  • 减:minus\
  • 乘:multiplies\
  • 除:divides\
  • 模取:modulus\
  • 否定:negate\
  1. 关系运算类仿函数
  • 等于:equal_to
  • 不等于:not_equal_to
  • 大于:greater
  • 大于等于:greater_equal
  • 小于:less
  • 小于等于:less_equal
  1. 逻辑运算仿函数
  • 逻辑与:logical_and

  • 逻辑或:logical_or

  • 逻辑否:logical_no

set中的排序

set里面自定义类型的时候,默认给的比较函数是less<结构名>,插入元素的时候,会进行元素的比较。

解决方案:

  1. 在类型中定义一个比较函数
1
2
3
4
5
6
7
8
9
10
struct symbol
{
bool operator < (const symbol& r)
//blablabla
}

当然,也可以用greater作为比较,比如set<symbol, greater<symbol>> test

  1. 自己写一个仿函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <set>
#include <functional>
using namespace std;
struct Symbol
{
char name[10];
};
struct SymCmp
{
bool operator () (const Symbol& x, const Symbol& y) const
​ {
if (strcmp(x.name, y.name) < 0)
return true;
else
return false;
​ }
};
set<Symbol, SymCmp> gSet;
//main函数