有序数据结构的交与并
需要注意:
1:求并集和交集前,需要将两个数组先进行排序 (int 或者 vector都需要),否则结果有误
2:需要定义vector的size,否则可能无法得到结果
vector的并
#include <bits/stdc++.h> using namespace std; int main() { int a[4]= {1,2,3,4}; //已经有序,若无序,需要排序! int b[4]= {2,3,4,5}; vector<int> c(8); //需要定义大小 set_union(a,a+4,b,b+4,c.begin()); //并集 for(auto x:c) cout<<x<<" "; return 0; }
vector的交
#include <bits/stdc++.h> using namespace std; int main() { int a[4]={1,2,3,4}; //已经有序,若无序,需要排序! int b[4]={2,3,4,5}; vector<int> c(8); auto it=set_intersection(a,a+4,b,b+4,c.begin()); //交集 返回位置到it cout<<it-c.begin()<<endl; //交集中元素个数 for(int i=0;i<it-c.begin();i++) //输出这些元素 cout<<c[i]<<" "; return 0; }
set 的并
#include <bits/stdc++.h> using namespace std; int main() { set<int> a,b,c; for(int i=1; i<5; i++) //a: 1 2 3 4 a.insert(i); for(int i=2; i<6; i++) //b: 2 3 4 5 b.insert(i); set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())); //并集 for(auto x:c) cout<<x<<" "; return 0; }
set 的交
#include <bits/stdc++.h> using namespace std; int main() { set<int> a,b,c; for(int i=1; i<5; i++) //a: 1 2 3 4 a.insert(i); for(int i=2; i<6; i++) //b: 2 3 4 5 b.insert(i); set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())); for(auto x:c) cout<<x<<" "; return 0; }
P05524. 集合
Description
给定两个集合A、B,集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5。
我们希望求出只需确定在B 中但是不在 A 中的元素的个数即可
Format
Input
输入两行,分别表示两个集合
每行的第一个整数为这个集合的元素个数(至少一个),然后紧跟着这个集合的元素(均为不同的正整数)
Output
在B 中但是不在 A 中的元素的个数即可
Samples
输入数据 1
8 1 2 3 4 5 6 7 8
6 2 3 4 5 6 7
输出数据 1
0
#include<bits/stdc++.h> using namespace std; set<int>s1,s2,ans; int main() { int n,m; cin>>n; for(int i=1,x;i<=n;i++) { scanf("%d",&x); s1.insert(x); } cin>>m; for(int i=1,x;i<=m;i++) { scanf("%d",&x); s2.insert(x); } set_difference( s2.begin(), s2.end(),s1.begin(), s1.end(),inserter(ans,ans.begin() ) ); cout<<ans.size()<<endl; }
典型试题