Set
Set 是什么
Set 是 C++STL 中提供的容器, set 是数学上的集合——具有唯一性,即每个元素只出现一次,而 multiset 则是可重集(即每个元素可多次出现),两者的内部实现是一棵红黑树,它们支持的函数基本相同;
排序
set 支持自动排序,默认是由小到大排,和很多其他排序数据结构一样,也可以手写排序,就是重载小于号;
如果是单纯的要由大到小排也可以:set< int,greater<int> >se;//由大到小排序
如果有多个关键字,那么可以手写结构体,重载小于号;
//x为第一关键字,由x由大到小排,其实就是改变原来的排序规则
struct node{
int x,y;
bool operator < (const node& rhs) const{return x>rhs.x;}
};
set<node>se;
se.insert((node){2,10});//这个插入比较特别
se.insert((node){10,2});
当然也可以直接pair,省的重载了,这个只限于两个关键字;
//和set的默认排序是一样的,以pair第一个关键字排序
#define pa pair<int,int>
set<pa>se;
se.insert(pa(10,20)),se.insert(pa(100,20));//这个插入比较特别
判断set中是否存在这个元素
set<int>se;
se.count(x);//存在返回1,不存在返回0
迭代器
双向访问迭代器,不支持随机访问,仅支持“++”,“–”这两个算术操作;
这个两个复杂度都为O(lgn);
删除元素
参数可以是元素或者迭代器,返回下一个元素的迭代器,时间复杂度为 O(logn) ,注意multiset 中 s.erase(x) 会删除所有值为 x 的元素;
几个二分查找
说说 find 查找,这个和其他三种不同的是,find 是准确找到要查找的元素 x ,返回其迭代器,如果不存在,则返回set.end();
set<int>se;
if(s.find(x)!=s.end()) {}
其他三种就不重复讲了,注意返回值是迭代器,不是数组下标;