1.set 翻译为集合
,是一个内部自动有序且不含重复元素的
容器。set 最主要的作用就是自动去重并按升序排序,因此遇
到需要去重但是又不方便直接开数组的情况。set 中的元素是
唯一的,其内部采用“红黑树”实现。
使用 set 前,必须先添加 set 头文件,即 #include ,
同时,必须要有“using namespacestd”。
定义一个 set 的方法如下:
set name;
其中,typename 可以是任何基本类型或者容器,name
是集合的名字。
2.
3.
3,count的使用
#include <iostream>
#include <set>
using namespace std;
int main()
{set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;
return 0;
4,删除
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
set<int> s;
set<int>::const_iterator iter;
set<int>::iterator first;
set<int>::iterator second;
for(int i = 1 ; i <= 200 ; ++i)
{s.insert(i);} //第一种删除
s.erase(s.begin()); //第二种删除
first = s.begin();
second = s.begin();
second++; second++;
s.erase(first,second); //第三种删除
5.返回值
lower_bound(key_value) ,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回最后一个大于等于key_value的定位器
set<int> s;
s.insert(1);
s.insert(3);
s.insert(4);
cout<<*s.lower_bound(2)<<endl;
cout<<*s.lower_bound(3)<<endl;
cout<<*s.upper_bound(3)<<endl;
6.迭代器
• set只能通过迭代器访问。即先定义一个迭代器:
set<typename>::iterator it;
然后使用“*it”来访问set中的元素。
• for(it = s.begin() ; it != s.end() ; ++it)
• {
•
cout<<*it<<" ";
• }
• 另外:
• Size() 表示集合中元素的个数
• clear()表示清空集合;
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N <= 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
Input
输入数据有多组
每组有2行,第1行为1个正整数,表示所生成的随机数的个数:N
第2行有N个用空格隔开的正整数,为所产生的随机数。
Output
每组输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
Sample Input
10
20 40 32 67 40 20 89 300 400 15
Sample Output
8
15 20 32 40 67 89 300 400
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
set<int>vis;
int main()
{ int n,i,m;
while(~scanf("%d\n",&n))
{
vis.clear();
for(i=1;i<=n;i++)
{
scanf("%d",&m);
vis.insert(m);
}
printf("%d\n",vis.size());
set<int>::iterator it;
for(it=vis.begin();it!=vis.end();it++)
{ if(it==vis.begin())
printf("%d",*it);
else printf(" %d",*it);
}
printf("\n");
}
return 0;
}
要英语考试,小雅同学准备考小熊同学英语单词。
会就输出YES
不会就输出NO
Input
输入一个n,(1<=n<=1000)代表要考的单词的个数;
然后每行是一个数字和这个单词;数字为0或1;
0表示记忆单词;
1表示询问单词会还是不会?
Output
对于每个单词的询问,输出YES 或NO
Sample Input
5
0 good
0 red
1 goose
0 goose
1 goose
Sample Output
NO
YES
#include <bits/stdc++.h>
using namespace std;
int t,opt;
string name;
set<string>s;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>opt>>name;
if(opt==0)s.insert(name);
else
{
if(s.find(name)!=s.end())printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
现有n个正整数,n≤10000,要求出这n个正整数中的第k个最小整数(相同大小的整数只计算一次),k≤1000,正整数均小于30000。
Input
第一行为n和k; 第二行开始为n个正整数的值,整数间用空格隔开。
Output
第k个最小整数的值;若无解,则输出“NO RESULT”。
Sample Input
10 3
1 3 3 7 2 5 1 2 4 6
Sample Output
3
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
set<int>vis;
int main()
{ int n,i,m,k,j;
while(~scanf("%d %d\n",&n,&k))
{ j=0;
vis.clear();
for(i=1;i<=n;i++)
{
scanf("%d",&m);
vis.insert(m);
}
i=0;
set<int>::iterator it;
for(it=vis.begin();it!=vis.end();it++)
{
i++;
if(i==k) {printf("%d\n",*it);j=1;break;}
}
if(j==0) printf("NO RESULT\n");
}
return 0;
}
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有 N 条平行的轨道,如图 10.6-1 所示。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有 9趟列车,在入口处按照 {8,4,2,5,3,9,1,6,7} 的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
Input
第 1 行给出 1 个正整数 N,2≤N≤1e5 。
第 2 行给出从 1~N 的正整数序号的一个重排列,数字间以一个空格分隔
Output
输出一行一个数,表示可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
Sample Input
9
8 4 2 5 3 9 1 6 7
Sample Output
4
#include <bits/stdc++.h>
using namespace std;
set<int>s;
set<int>::iterator it;
int n,x,ans=1;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
if(s.empty())s.insert(x);
else
{
it=s.upper_bound(x);//it是set容器中第一个大于x的迭代器
if(it==s.end())
//x比set容器中的所有数都要大,将x插入,需要增加铁轨
{
s.insert(x);
ans++;
}
else
//x插入到已有的铁轨中合适的位置,删除大于x的第一个数(*it),插入x
{
s.erase(*it);
s.insert(x);
}
}
}
printf("%d\n",ans);
return 0;
}