set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而 set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可 完成,不涉及到内存移动和拷贝,所以效率比较高。
set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列。如果需要集合中的元素允许重复那么可以使用multiset
插入和删除要比向量(vector)快,但插入比容器内元素都大的新元素或查找元素时会有些慢。
使用时要加头文件
#include<set>
struct compare
{
bool operator()(const int &a,const int &b)const
{
return a<b; //定义比较关系<
}
}; //运算符重载,重载<
//定义了<之后,==和>以及>=,<=就都确定了,STL的比较关系都是用<来确定的,所以必须通 过定义< “严格小于”来确定比较关系
定义: set<int>st; //集合容器
set<int,compare> st3;//自定义内部比较函数为conpare(只定义"<",其他的均由)
set<T> st2(st) //创建一个与st相同的容器
vecter<int>vec;
st(vec.begin(),vec.end());//用vector初始化set
set<int>:iterator p; 定义set迭代器
set<int>:: reverse_iterator p3; 定义反向集合定位器(MS没什么用)
int x;
成员函数:
begin //返回集合首元素位置迭代器
end //返回集合尾元素位置迭代器
insert(x) //将元素x加入集合
find(x) // 返回x所在位置的迭代器,找不到返回st.end()
clear() //清空集合
empty() //判断集合是否为空
erase(x) //删除x这个元素
erase(p) //删除p位置的元素
count(x) //判断是否存在元素x 存在返回1 , 否则返回0
lower_bound(x) //返回第一个大于等于x的迭代器,找不到返回st.end();
upper_bound(x) //返回第一个大于x的迭代器,找不到返回st.end();
s.equal_range(x) //返回lower_bound(x)和upper_bound(x)(感觉用来查找比find靠谱)
size() //返回容器中元素个数
st.swap(st2) //交换st与st2的元素 (也可以写成st2.swap(st))
集合的判等 ==
两个集合相等,当且仅当他们的元素个数相等,且同一个位置上的值相等.
集合比较大小
两个集合比较是基于第一个不同的元素的大小比较
练手例题:HNOI2004 宠物收养所
http://www.cnblogs.com/evan-oi/archive/2012/03/24/2415297.html
如果说这俩玩意有什么用呢,还真没什么用...赛场上没时间写平衡树就用它骗骗分吧。