使用STL实现集合的交并差操作
集合运算的前提是两个集合必须按照同样的规则排序就绪
vector是无序集合,参与运算前必须首先排序;map,set是有序
核心函数是
set_intersection()
set_union()
set_difference()
使用的话看代码吧,下面的代码是个人认为比较透彻比较灵活的版本,在codeblocks运行正常。
更改只需要改参与运算的集合名称
题目链接:https://acm.ecnu.edu.cn/problem/2853/
1 /**
2
3 author: gudy
4
5 v.1
6
7 使用STl的set_intersection set_union set_difference函数实现交集并集差集
8
9 版本1与0区别在于读入集合时是直接使用set,0经过vector到set的转换,效率要低一点
10
11 */
12 #include<bits/stdc++.h>
13 using namespace std;
14 int main(){
15 int lenA,lenB;
16 cin >> lenA >> lenB;
17 //cout << "ok0" << lenA << lenB << endl;
18 set<int> s_a,s_b;
19 string line,word;
20 //这个get为了吃第一行的换行
21 cin.get();
22 //读取一行
23 getline(cin ,line);
24 istringstream record1(line);
25 while(record1 >> word){
26 s_a.insert(atoi(word.c_str()));
27 }
28 /*
29 vector<int>::iterator it_a = a.begin();
30 while(it_a != a.end()){
31 cout << *it_a << " ";
32 it_a++;
33 }
34 cout << "ok1" << endl;
35 */
36 //读取一行
37 getline(cin ,line);
38 istringstream record2(line);
39 while(record2 >> word){
40 s_b.insert(atoi(word.c_str()));
41 }
42 /*
43 vector<int>::iterator it_b = b.begin();
44 while(it_b != b.end()){
45 cout << *it_b << " ";
46 it_b++;
47 }
48 cout << "ok2" << endl;
49 */
50 //排序
51 //集合运算的前提是两个集合必须按照同样的规则排序就绪
52 //vector是无序集合,参与运算前必须首先排序.
53 //使用vector可以保留个数信息,这儿不需要,选择原始集合的数据结构用set
54 //sort(a.begin(),a.end());
55 //sort(b.begin(),b.end());
56
57
58 //交
59 vector<int> v_intersection;
60 //调用核心函数
61 set_intersection(s_a.begin(),s_a.end(),s_b.begin(),s_b.end(),insert_iterator<vector<int> >(v_intersection,v_intersection.begin()));
62 cout << "{";
63 //判断非空,如果为空,输出第一个数字时程序会直接崩溃
64 if(v_intersection.size() != 0){
65 vector<int>::iterator it_inter = v_intersection.begin();
66 cout << *it_inter;
67 it_inter++;
68 while(it_inter != v_intersection.end()){
69 cout << "," << *it_inter ;
70 it_inter++;
71 }
72 }
73 cout << "}" << endl;
74
75 //并
76 vector<int> v_union;
77 set_union(s_a.begin(),s_a.end(),s_b.begin(),s_b.end(),insert_iterator<vector<int> >(v_union,v_union.begin()));
78
79 cout << "{";
80 if(v_union.size() != 0){
81 vector<int>::iterator it_union = v_union.begin();
82 cout << *it_union;
83 it_union++;
84 while(it_union != v_union.end()){
85 cout << "," << *it_union;
86 it_union++;
87 }
88 }
89 cout << "}" << endl;
90
91 //差
92 vector<int> v_diff;
93 set_difference(s_a.begin(),s_a.end(),s_b.begin(),s_b.end(),insert_iterator<vector<int> >(v_diff,v_diff.begin()));
94 cout << "{";
95 if(v_diff.size() != 0){
96 vector<int>::iterator it_diff = v_diff.begin();
97 cout << *it_diff;
98 it_diff++;
99 while(it_diff != v_diff.end()){
100 cout << "," << *it_diff;
101 it_diff++;
102 }
103 }
104 cout << "}" << endl;
105 return 0;
106 }