STL set

Set
是什么

Set
是C++STL
中提供的容器,set
是数学上的集合——具有唯一性,即每个元素只出现一次,而multiset
则是可重集,两者的内部实现是一棵红黑树,它们支持的函数基本相同

Set
的相关操作

头文件

#include
1
声明:

像这样:

set<类型>名称;
1
比如:

sets;
set<vector >s; //vector中提供重载<
set<set >s; //平衡树嵌套,哈哈
multisets;
1
2
3
4
就像其他需要排序的数据类型一样,为一个结构体的set
,需要重载小于号

struct node{
…;
};
sets;
bool operator <(const node &ai,const node &bi)
{
return ai.x>bi.x;
}
1
2
3
4
5
6
7
8
set.size()
统计set
中元素个数,函数返回一个整形变量,表示set
中元素个数,时间复杂度O(1)

用法:名称.size();
eg.
int num=s.size();
1
2
3
set.empty()
检查set
是否为空,返回一个bool
型变量,1表示set
为空,否则为非空,时间复杂度O(1)

用法:名称.empty();
eg.
if(s.empty())
cout<<“Myset is Empty.”<<endl;
1
2
3
4
set.clear()
清空set
,无返回值

用法:名称.clear();
eg.
s.clear();
1
2
3
set.count(x)
返回set
或multiset
中值为x
的元素个数,时间复杂度为O(logn)
用法:名称.count(x)
eg.
if(!s.count(x))
ans++;
1
2
3
4
迭代器

双向访问迭代器,不支持随机访问,支持星号解除引用,仅支持“++”,“–”这两个算术操作

引用和操作:

set<类型>::iterator it;
eg.
set::iterator it=s.begin();
it++;
it–;
1
2
3
4
5
若把it++
,则it
将会指向“下一个”元素。这里的下一个是指在key
从小到大排序的结果中,排在it
下一名的元素。同理,若把it−−
,则it
会指向排在上一个的元素

“++”,“–”操作的复杂度均为O(logn)
遍历set
及访问其中的元素

//set
for(set::iterator it=s.begin();it!=s.end();it++)
cout<<*it<<endl; //取出这个迭代器指向的元素
//set嵌套
for(set<set >::iterator it=s.begin();it!=s.end();it++)
{
//首先取出set中嵌套的set
for(set::iterator rit=(*it).begin();rit!=(*it).end();rit++)
cout<<rit<<’ '; //遍历这个set
cout<<endl;
}
1
2
3
4
5
6
7
8
9
10
11
set.begin()
返回集合的首迭代器,即指向集合中最小元素的迭代器,时间复杂度为O(1)
用法:名称.begin();
eg.
map::iterator it=s.begin();
1
2
3
set.end()
返回集合的尾迭代器,众所周知,STL中区间都是左闭右开的,那么end()
函数返回的迭代器即为指向集合中最大元素的下一个位置的迭代器,因此−−s.end()
才是指向集合中最大元素的迭代器,时间复杂度为O(1)
用法:名称.end();
eg.
maxn=
(–s.end()); //取出最大元素
1
2
3
set.insert(x)
在set
中插入元素,返回插入地址的迭代器和是否插入成功的bool
并成的pair
,时间复杂度为O(logn)
PS:set
在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效(multiset
可以重复)

用法:名称.insert(set类型);
eg.
s.insert(3);
1
2
3
set.erase(参数)
删除,参数可以是元素或者迭代器,返回下一个元素的迭代器,时间复杂度为O(logn)
,注意在multiset
中s.erase(x)
会删除所有值为x
的元素

用法:名称.erase(参数);
eg.
set::iterator it=s.begin();
s.erase(it);
s.erase(3);
1
2
3
4
5
set.find(x)
在set
中查找值为x
的元素,并返回指向该元素的迭代器,若不存在,返回set.end()
,时间复杂度为O(logn)
用法:名称.find(x);
eg.
if(s.find(x)!=s.end())
cout<<“Have Found!”<<endl;
1
2
3
4
set.lower
_ bound(x)/upper
_ bound(x)
两个神奇的东西,决定把他们放在一块谈一谈

用法与find
类似,但查找的条件略有不同,时间复杂度O(logn)
s.lower
_bound(x)
表示查找>=x
的元素中最小的一个,并返回指向该元素的迭代器

s.upper
_bound(x)
表示查找>x
的元素中最小的一个,并返回指向该元素的迭代器

举个例子:

在set
{3,5,7,8,13,16
}中

对于在set
中存在的元素,比如8

s.lower
_bound(8)
返回8所在位置的迭代器

s.upper
_bound(8)
返回13所在位置的迭代器

对于在set
中不存在的元素,比如12

两个函数返回的则都是13所在位置的迭代器

特殊地,

对于比set
中最大的元素大的元素,比如20

两个函数返回的都是s.end()

作者:Ivanovcraft
来源:CSDN
原文:https://blog.csdn.net/qq_42713350/article/details/81075509
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值