Set用法 ——需要引用#include <set>库
set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。
set中常用的方法
begin() ,返回set容器的第一个元素
end() ,返回set容器的最后一个元素
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
find() , 返回给定值值得定位器,如果没找到则返回end()。
insert(key_value); 将key_value插入到set中
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
特点 去重 有序
#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
int main(){
set<int> s;
s.insert(2);
s.insert(3);
s.insert(1);
s.insert(20);
s.insert(2);
for(set<int> ::iterator it = s.begin(); it!=s.end();){
printf("*it = %d\n",*it);
it++;
}printf("\n");
}
例2:
#include<cstdio>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
set<int> result = s;
for(set<int> ::iterator it = s.begin(); it!=s.end(); it++){
printf("%d ",*it);
}
printf("\n");
result.erase(1);
for(set<int> ::iterator it = result.begin(); it != result.end(); it++){
printf("%d ",*it);
}
printf("\n");
set<int> :: iterator it = result.find(2);
printf("*it = %d\n",*it);
set<int> ::iterator it_1 = result.find(10);
if(it_1 != result.end()) printf("*it = %d\n",*it_1);
else printf("cant't find 10 \n");
}
二维 set
int main(){
set<int> a[maxn];
int i;
for(i = 0;i< 2;i++){
for(int j = 0;j< 5;j++) a[i].insert(j);
}
for(i = 0;i< 2;i++){
for(set<int>::iterator it = a[i].begin();it!=a[i].end();it++){
cout << *it << " ";
}cout<<"\n";
}
}
不能将一个set 直接使用 =号赋值给另外一个set
multiset
multiset是一个可容纳重复元素键值的有序多重集合容器它们的区别主要在于set不允许重复元素键值,而multiset允许重复的元素键值。
1.按默认比较函数创建空的multiset;
multiset<int>s1;
2.拷贝另一个multiset生成新的multiset;
multiset<int>s3(s1);
//若拷贝的那个multiset有自定义比较函数,此multiset也要有相同比较函数;
multiset<int>ms;
1.插入元素value(可重复);
ms.insert(1);
2.删除所有键值为value的元素;
ms.erase(3);
3.搜索键值为value的元素(若不存在返回迭代器end)
if(ms.find(3)!=ms.end()) cout<<"multiset中存在键值为3的元素"<<endl;
else cout<<"multiset中不存在键值为3的元素"<<endl;
1.正向迭代遍历;
multiset<int>::iterator i;
cout<<"正向迭代遍历:";
for(i=ms.begin();i!=ms.end();i++)
{
cout<<*i<<" ";
}
cout<<endl;
2.反向迭代遍历;
multiset<int>::reverse_iterator ri;
cout<<"反向迭代遍历:";
for(ri=ms.rbegin();ri!=ms.rend();ri++)
{
cout<<*ri<<" ";
}
cout<<endl;
1.返回键值等于value的元素个数;
cout<<"键值等于3的元素个数为:"<<ms.count(3)<<endl;
2.返回multiset中的元素个数;
cout<<"multiset中的元素数为:"<<ms.size()<<endl;
4.清空multiset;
ms.clear();
5.判断multiset是否为空;
if(ms.empty()) cout<<"multiset为空"<<endl;
例题:
给你两个集合A和B ,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.
Input
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.
Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
Sample Input
1 2
1
2 3
1 2
1
1 2
Sample Output
1 2 3
1 2
#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
set<int> s;
int main(){
int n,m,x;
while(scanf("%d%d",&n,&m)!=EOF){
s.clear();
for(int i=0;i<n+m;i++){
scanf("%d",&x);
s.insert(x);
}
for(set<int>::iterator it = s.begin();it!=s.end();it++){
if(it!=s.begin()){
printf(" ");
}
printf("%d",*it);
}
printf("\n");
}
return 0;
}
评论区