头文件:
#include<set>
详细用法(部分):
set<int> t ------ 定义一个int类型的容器,注意set里的每个元素只会出现1次
t.insert(k) ------ 插入元素k,多次插入同一个元素后面无效
t.count(k) ------ 判断元素k是否在容器内
t.erase(k) ------ 删除元素k,若不存在则删除无效
t.clear() ------ 清空容器
t.size() ------ 返回容器现有元素个数
t.empty() ------ 判断容器是否为空
想遍历set里的元素或进行进一步修改,必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)
set<int>::iterator it ------ 定义正向迭代器
set<int>::reverse_iterator rit; ------ 定义反向迭代器
auto it = t.begin(); ------ 因为t.begin()返回正向迭代器,所以it自动被定义为正向迭代器,可适应其他所有 操作
以下需要迭代器的操作:
t.begin() ------ 返回set中第一个元素,类型为正向迭代器
t.rbegin() ------ 返回set中最后一个元素,类型为反向迭代器
t.end() ------ 返回set中最后一个元素,类型为正向迭代器
t.rend() ------ 返回set中第一个元素,类型为反向迭代器
t.find(k) ------ 寻找k,若找到返回对应的迭代器,否则返回end();
t.insert(a, b) ------ 插入指针[a, b)之间的元素,已有元素不会再次插入
t.erase(it) ------ 删除迭代器it对应的元素
t.erase(l, r) ------ 删除迭代器[l, r)之间的元素
lower_bound(k) ------ 返回第一个大于等于k的元素的迭代器
upper_bound(k) ------ 返回第一个大于k的元素的迭代器
#include <set>
using namespace std;
int main(){
//freopen("pengwen.txt","r",stdin);
//用来加速的,不同时使用cin和scanf.
ios::sync_with_stdio(false);
//下面是插入元素
set<int> s;
int n, k;
cout<<"请输入n:";
cin>>n;
getchar();
cout<<"插入数字:"<<endl;
for(int i=1; i<=n; i++) {
cin>>k;
s.insert(k);//插入
}
//下面介绍size()
//set集合自动排序,本题中size()用来计算元素个数
//例如:插入5 2 3 3 2 1 6 共7个数,s.size()将出 5;
//此时set中元素为1 2 3 5 6共5个。
cout<<"s.size()=" <<s.size()<<endl;
//下面输出结果
set<int>::iterator iter;
cout<<"set中元素: ";
for(iter=s.begin(); iter!=s.end(); iter++) {
cout<<*iter<<" ";
}
cout<<endl;
//下面介绍count()
if( s.count(4))
cout<<"4在set集合中."<<endl;
//下面介绍find()
iter=s.find(5);
if( iter!=s.end() )
cout<<*iter<<endl;
//下面介绍erator()
s.erase(4);
cout<<"set中元素: ";
for(iter=s.begin(); iter!=s.end(); iter++) {
cout<<*iter<<" ";
}
cout<<endl;
return 0;
}
题目描述
STL库中有许多非常实用的函数,如sort,set,map,vector,queue等。
此题为set集合的应用教学,题目如下:
读入n个数,要求输出出现的不同数字的个数
输入
第一行读入一个 n ( 0<n<=1000000)
第二行读入n个整数k (-2^31 <= k < 2^31 )
输出
输出一个整数答案
样例输入
5
1 3 1 99999999 3
样例输出
3
#include<iostream>
#include<set>
using
namespace
std;
int
main()
{
set<
int
> s;
int
n;
int
k;
scanf
(
"%d"
,&n);
for
(
int
i=1; i<=n; i++){
scanf
(
"%d"
,&k);
s.insert(k);
}
printf
(
"%d\n"
,s.size());
return
0;
}
读入n个数,要求按照从小到大的顺序输出出现的不同数字。
输入
第一行读入一个 n ( 0<n<=1000000)
第二行读入n个整数k (-2^31 <= k < 2^31 )
输出
按从小到大的顺序输出不同的数字
样例输入
5
1 3 1 99999999 3
样例输出
1 3 99999999
#include <cstdio>
#include <set>
using
namespace
std;
int
main()
{
int
n;
scanf
(
"%d"
,&n);
long
long
temp;
set<
long
long
> s;
for
(
int
i=0;i<n;i++){
scanf
(
"%lld"
,&temp);
s.insert(temp);
}
for
(set<
long
long
>::iterator j = s.begin();j!=s.end();++j){
printf
(
"%lld "
,*j);
}
printf
(
"\n"
);
return
0;
}
运动会又开始了,acm俱乐部的出题组成员因要忙着出题,便向教主申请了请假,教主写下了请假名单。
某成员想知道自己是否在请假名单中,请通过set集合进行解答,如果有请输出YES,否则输出NO
输入
第一行 包括整数n(名单人数,可能有重复)和 name (某成员的名字)
第二行 请假名单
输出
输出YES或者NO
样例输入
5 zgc
zgc czh zn wsw zn
样例输出
YES
提示
set的元素也可以是字符串的哦 ,set同样支持结构体,但需要注意的是C++中的set具有自动排序的功能,那么排序结构体的时候就需要重载结构体的<号规则
#include <cstdio>
#include <iostream>
#include <set>
using
namespace
std;
set <string> vis;
int
main(){
ios::sync_with_stdio(
false
);
cin.tie(0);
int
n;
string name;
cin>>n>>name;
for
(
int
i=1;i<=n;i++){
string str;
cin>>str;
vis.insert(str);
}
if
(vis.count(name)) cout<<
"YES"<<endl
;
else
cout<<
"NO"<<endl
;
return 0;
}