//------------------------------------集合---------------------------------// /* 题目描述 给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。 输入描述: 每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。 输出描述: 针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格。 示例1 输入 3 3 1 3 5 2 4 6 输出 1 2 3 4 5 6 */ /* 我使用了两种方法 第一种是标准库的set,用这个比较简单,不用判断数字是否重复,因为set就是不重复, 并且排序的集合,默认排序为升序,如果遇到相同的数,会直接忽略,不重复的数才放 入,在stl内部使用红黑树实现的,这是一个平衡二叉树,不做太多说明。 第二种用的vector,把所有数push_back进去,用算法sort排序后,用unique删除重 复元素(去除重复元素后,空间还是在那里,需要用erase删除空间) */ #include<iostream> #include<algorithm> #include<set> #include<vector> using namespace std; int f8() { //法1 int numA, numB; cin >> numA >> numB; int temp; set<int> s; for (int i = 0; i < numA; ++i) { cin >> temp; s.insert(temp); } for (int i = 0; i < numB; ++i) { cin >> temp; s.insert(temp); } auto ptr = s.cbegin(); for (int i = 0; i < s.size() - 1; ++i) { cout << *ptr << " "; ++ptr; } cout << *ptr; return 0; //法2 /* int numA, numB; cin >> numA >> numB; vector<int> A, B; int temp; for(int i = 0; i < numA; ++i) { cin >> temp; A.push_back(temp); } for(int i = 0; i < numB; ++i) { cin >> temp; B.push_back(temp); } vector<int> vec(A); for(int i = 0; i < B.size(); ++i) vec.push_back(B[i]); sort(vec.begin(), vec.end()); auto ptr = unique(vec.begin(), vec.end()); vec.erase(ptr, vec.end()); for(int i = 0; i < vec.size() - 1; ++i) cout << vec[i] << " "; cout << *(vec.cend() - 1); return 0; */ }