使用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 }

 

原文地址:https://www.cnblogs.com/gudygudy/p/12916631.html