1.关于set的概念
set 是STL中的集合。
集合我们都很熟悉,具有排异性,在这里set中也遵循这条规矩。 而且在set中,存在系统自动排序的操作。
2.set的常用函数
set 与 vector具有类似的用法
#include<set> //set 的头文件 set<int> s; //声明一个int型set变量,名为s s.empty() //判定 s 是否为空 s.insert(1); //把数字1插入到s中 s.clear(); //清空s s.erase(1); //假若s存在1,则删除1 s.begin(); //返回s中第一个元素地址 所以 *s.begin() s.end(); //返回s中最后一个元素地址
//这个特殊一点,返回的是s中最后一个元素的下一个元素
//所以 *(--s.end())是s最后一个元素 s.rbegin(); //rbegin可以看做逆向的第一个地址 相当于(--s.end()) 此处取的已经是s最后一个元素 s.rend(); //rend可以看做逆向的最后一个地址 相当于 s.begin() s.count(1); //计算s中1出现的次数,而次数只存在0与1,所以可以借来查找是否存在1 s.size(); //返回s中元素的个数 s.max_size(); //s最大能存元素的数目 s.find(2); //查找2 set<int>::iterator iter; //迭代器
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
//lower_bound(key_value) ,返回第一个大于等于key_value的定位器
//upper_bound(key_value), 返回最后一个大于等于key_value的定位器
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
s.insert();
s.insert();
s.insert();
cout<<*s.lower_bound()<<endl;
cout<<*s.lower_bound()<<endl;
cout<<*s.upper_bound()<<endl;
return ;
}
运行结果:
小结:set中的操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。
附上一道set的入门题:
hdu 1412 {A} + {B} http://acm.hdu.edu.cn/showproblem.php?pid=1412
Problem Description
给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素. Input
每组输入数据分为三行,第一行有两个数字n,m(<n,m<=),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开. Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开. Sample Input Sample Output
AC代码:
#include<iostream>
#include<set>
using namespace std;
int main()
{
int n,m,x;
set<int>s;
set<int>::iterator it;
while (cin>>n>>m){
s.clear();
for (int i=;i<n+m;i++){
cin>>x;
s.insert(x);
}
it=s.begin();
int cnt=s.size();
for (int i=;i<=cnt;i++){
if (i==)
cout<<*it;
else
cout<<" "<<*it;
it++;
}
cout<<endl;
}
return ;
}