【简介】
set是有序集合,multiset是有序多重集合。set的键和值是统一的,值就是键,set的每个键都是唯一的,不允许重复;而multiset与set类似,只是允许多个值的键相同。使用set或multiset时,需要引入头文件#include
set或multiset的迭代器为双向访问,不支持随机访问。执行一次“++”和“–”操作的时间复杂度均为O (logn)。
默认的元素顺序为升序,也可以通过第2个模板的参数设置为降序。
set<int>a; //升序
set<int , greater<int> >a; //降序,注意greater 后面有空格,避免两个 > 一起,有右移的歧义
【成员函数】
【举个栗子】
【HDU No. 1412 集合合并】

题意
给定两个集合A 、B ,求A + B (在同一个集合中不会有两个相同的元素)。
【输入输出】
输入:
每组输入数据均分为三行。第1行包含两个整数n 和m(0
输出: 单行输出合并后的集合,要求从小到大输出,元素之间以一个空格隔开。
【样例】


【算法设计】
两个集合的合并问题,集合不允许元素重复,且输出时有序,set是有序集合,且每个键都是唯一的,不允许重复
→ 使用 set 解决。
【步骤】
【算法实现】
#include
#include
using namespace std;
int n , m , x;
set<int> sum;
int main(){
while(~scanf("%d%d",&n, &m)){
sum.clear();
for(int i = 0 ; i < n ; i ++){
scanf("%d",&x);
sum.insert(x);
}
for(int j = 0 ; j < m ; j++){
scanf("%d", &x);
sum.insert(x);
}
for(set<int>::iterator it = sum.begin() ; it != sum.end() ; it ++){
if(it != sum.begin()) {
printf(" ");
}
printf("%d",*it);
}
printf("\n");
}
return 0;
}
