今天做了一道Set的板子题,发现我根本没学过Set(我开始慌了),于是乎学起来了。
Set就相当于数学里的集合,满足互异性,也就是说如果你往Set里扔两个2,Set只能存下第一个,而且Set (貌似) 就是自带排序,这一点和数学里集合的无序性并不相同所以要注意一下。
Set有以下几种操作:
-
b e g i n ( ) begin() begin()–返回指向第一个元素的迭代器
-
c l e a r ( ) clear() clear()–清除所有元素
-
c o u n t ( ) count() count()–返回某个值元素的个数
-
e m p t y ( ) empty() empty()–如果集合为空,返回true
-
e n d ( ) end() end()–返回指向最后一个元素的迭代器
-
e q u a l equal equal_ r a n g e ( ) range() range()–返回集合中与给定值相等的上下限的两个迭代器
-
e r a s e ( ) − 删 除 集 合 中 的 元 素 { e r a s e ( i t e r a t o r ) , 删 除 定 位 器 i t e r a t o r 指 向 的 值 e r a s e ( f i r s t , s e c o n d ) , 删 除 定 位 器 f i r s t 和 s e c o n d 之 间 的 值 e r a s e ( k e y _ v a l u e ) , 删 除 键 值 k e y _ v a l u e 的 值 erase()-删除集合中的元素\begin{cases} erase(iterator) ,删除定位器iterator指向的值\\ erase(first,second),删除定位器first和second之间的值\\ erase(key\_value),删除键值key\_value的值 \end{cases} erase()−删除集合中的元素⎩⎪⎨⎪⎧erase(iterator),删除定位器iterator指向的值erase(first,second),删除定位器first和second之间的值erase(key_value),删除键值key_value的值
-
f i n d ( ) find() find()–返回一个指向被查找到元素的迭代器
-
g e t _ a l l o c a t o r ( ) get\_allocator() get_allocator()–返回集合的分配器
-
i n s e r t ( ) insert() insert()–在集合中插入元素
-
l o w e r lower lower_ b o u n d ( ) bound() bound()–返回指向大于(或等于)某值的第一个元素的迭代器
-
k e y key key_ c o m p ( ) comp() comp()–返回一个用于元素间值比较的函数
-
m a x max max_ s i z e ( ) size() size()–返回集合能容纳的元素的最大限值
-
r b e g i n ( ) rbegin() rbegin()–返回指向集合中最后一个元素的反向迭代器
-
r e n d ( ) rend() rend()–返回指向集合中第一个元素的反向迭代器
-
s i z e ( ) size() size()–集合中元素的数目
-
s w a p ( ) swap() swap()–交换两个集合变量
-
u p p e r upper upper_ b o u n d ( ) bound() bound()–返回大于某个值元素的迭代器
-
v a l u e value value_ c o m p ( ) comp() comp()–返回一个用于比较元素间的值的函数
(但是要注意,这些函数大都是返回一个指针比如:8等返回迭代器的)
以上使用示例:
X
X
X
.
f
i
n
d
(
)
;
XXX.find();
XXX.find(); ,
X
X
X
XXX
XXX是Set的名字
定义一个Set:
S
e
t
<
X
X
X
>
n
a
m
e
Set <XXX> name
Set<XXX>name ,
X
X
X
XXX
XXX是Set的类型。
S
e
t
Set
Set 自带的排序是从小到大排列的。
若要反向需要用反向迭代器,来定义Set:
s
e
t
<
i
n
t
>
:
:
r
e
v
e
r
s
e
i
t
e
r
a
t
o
r
s
;
set<int>::reverse_iterator s;
set<int>::reverseiterators;
下面给一个例题:
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2761
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
#include<cstring>
#include<cctype>
using namespace std;
inline int read( )
{
int x = 0,k=1;char c = getchar( );
while(!isdigit(c))
{
if(c == '-')
k = -1;
c = getchar( );
}
while(isdigit(c)) x = (x<<1) + (x<<3) + (c^48),c = getchar( );
return x*k;
}
set<int>s;
int t,n,b[50005];
int main( )
{
t = read( );
for(int i = 1; i <= t; i++)
{
n = read( );
for(int i = 1; i <= n; i++)
{
b[i] = read( );
s.insert(b[i]);//元素加入
}
for(int i = 1; i <= n; i++)
{
if(s.find(b[i]) != s.end())//元素的查找
{
printf("%d ",b[i]);
s.erase(b[i]);//找到输出后就删除
}
}
printf("\n");
}
return 0;
}