set
s e t set set集合是 C + + S T L C++~~ STL C++ STL库中自带的一个容器, s e t set set具有以下两个特点:
-
s e t set set中的元素都是排好序的
-
s e t set set集合中没有重复的元素
常用操作:
set<int> s;
s.begin(); //返回set容器的第一个元素的地址
s.end(); //返回set容器的最后一个元素地址
s.clear(); //删除set容器中的所有的元素
s.empty(); //判断set容器是否为空
s.max_size(); //返回set容器可能包含的元素最大个数
s.size(); //返回当前set容器中的元素个数
s.erase(it); //删除迭代器指针it处元素
s.erase(begin,end); //删除迭代器区间[begin,end]的元素
s.erase(int x); //删除set中值为x的元素
s.insert(a); //插入某个元素
查找函数
s e t set set的查找函数有两个, c o u n t ( ) count() count()和 f i n d ( ) find() find()
-
c o u n t ( ) count() count() : 用来查找 s e t set set中某个元素出现的次数。这个函数在 s e t set set并不是很实用,因为一个键值在 s e t set set只可能出现 0 0 0或 1 1 1次,这样就变成了判断某一键值是否在 s e t set set出现过了
-
f i n d ( ) find() find(): 用来查找 s e t set set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s . e n d ( ) s.end() s.end() (最后一个元素的下一个位置, s s s为 s e t set set的变量名)
遍历数据
用迭代器遍历数据:
for(set<int>::iterator it = s.begin(); it != s.end(); it++){
cout<<*it<<endl;
}
二分查找函数
由于 s e t set set的元素是排好序的,那么一些问题中,如果需要查找很多区间的最大(小)值,那么我们可以直接调用 s e t set set,每次对当前加入 s e t set set元素二分查找即可
lower_bound(val)
在 s e t set set中查找大于或等于 v a l val val的第一个元素,并返回其迭代器位置,如果没有找到则返回 s e t . e n d ( ) set.end() set.end()
set<int> s;
for(int i=1;i<10;i++) s.insert( (i>>4)*20%74 );
auto ans=s.lower_bound(20);
if(ans!=s.end()) cout<<"success"<<endl;
else cout<<"fail"<<endl;
upper_bound(val)
在 s e t set set中查找大于 v a l val val的第一个元素,并返回其迭代器位置,如果没有找到则返回 s e t . e n d ( ) set.end() set.end()
set<int> s;
for(int i=1;i<10;i++) s.insert( (i>>4)*20%74 );
auto ans=s.upper_bound(20);
if(ans!=s.end()) cout<<"success"<<endl;
else cout<<"fail"<<endl;
unordered_set
和 u n o r d e r e d _ m a p unordered\_map unordered_map一样, u n o r d e r e d _ s e t unordered\_set unordered_set内部实现也是哈希表,因此数据插入和查找时间复杂度很低,但是缺陷是 u n o r d e r e d _ s e t unordered\_set unordered_set无法实现元素的排序功能,但是仍然是不可重复的元素集合(因为哈希函数的原因)
常用操作
实际上和 s e t set set几乎一样的
unordered_set<int> s;
s.begin(); //返回set容器的第一个元素的地址
s.end(); //返回set容器的最后一个元素的下一个元素的地址
s.clear(); //删除set容器中的所有的元素
s.empty(); //判断set容器是否为空
s.max_size(); //返回set容器可能包含的元素最大个数
s.size(); //返回当前set容器中的元素个数
s.erase(iterator it); //删除迭代器指针it处元素
s.erase(begin,end); //删除迭代器区间[begin,end]的元素
s.erase(int x); //删除set中值为x的元素
s.insert(a); //插入某个元素