您的位置:首页 > 其它

ACM练级日志:set

2014-08-09 22:13 204 查看
STL这个东西有时候会出乎意料的好用,第7篇那个让我写了200行的Treap用set这个玩意可以省掉很多代码……所以之后又用set重新写了一遍,正好以前也没用过set,记录一下,万一下次还有呢。

set需要开#include<set>,包含set和multiset;set是一个排好序的数据结构,不管你以什么顺序塞进去的,里面都是排好序的,比如你塞5,2,9,1进去,set里面就是1,2,5,9. set和multiset的区别就在于multiset允许重复,就是可以有1 2 2 2 3 5 这样的,set不可以有。

定义一个set的方法是 set<int> the_set,两个尖括号里面就是set内的数据类型。

set是一种STL中的“容器”,对于容器,需要一种叫迭代器的指针一样的东西,定义指针的方法是set<int> :: iterator p_set,就定义了一个迭代器p_set,它可以用来指set<int>。

当然那个迭代器的创建代码看着就让人烦,有些人是这么干的:开头先写上typedef set<int>::iterator Set_PType, 这样以后只要Set_PType p_set就可以了,看起来就舒服多了。

set常用的函数:

the_set.insert(x) 插入x

the_set.find(x) 查找x(如果没有找到,返回的是the_set.end() )

the_set.erase(p_set) 删掉p_set这个位置上的元素

the_set.upper_bound(x) 查找第一个比x大的元素的位置

the_set.lower_bound(x) 查找第一个比x大或等于的元素位置

当然,也可以用自定义类型放进set里,可以用比较小的代价实现哈希的效果。比如HDU 4277,1w x1w x1w的需要记住的量用三维数组是存不下的,我就用了set<ttype>,其中ttype就是一个三元组,就可以搞定了。但是需要注意!! 这种自定义类型必须要重载小于号(否则编译会出错),而且一定要重载对,否则会出现你找结构体的时候找不到的情况。明明你s.insert(t)了,当你再想找t的时候却发现找不到,十有八九是重载小于号的部分写错了。这道题就是这里让我查了半天。

所以一些平衡树的题(还有需要用哈希的题)用set之类的做可以省很多事。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: