c++ set 交集 并集 差集

《Problem A: 求集合的交并补集》

Time Limit: 1 Sec Memory Limit: 4 MB
Submit: 973 Solved: 242
[Submit][Status][Web Board]
Description
任意给定两个包含1-30000个元素的集合A,B(集合中元素类型为任意整型数,且严格递增排列),求A交B、A并B、A-B和B-A集合。

Input
输入第一行为测试数据组数。每组测试数据两行,分别为集合A、B。每行第一个数n(1<=n<=30000)为元素数量,后面有n个严格递增的绝对值小于2^31代表集合中包含的数。

Output
对每组测试数据输出5行,第1行为数据组数,后4行分别为按升序输出两个集合的A交B、A并B、A-B和B-A集合。格式见样例。

Sample Input
1
3 1 2 5
4 2 3 5 8

Sample Output
Case #1:
2 5
1 2 3 5 8
1

3 8


法1:

<span style="font-size:18px;">#include <iostream>
#include <set>
#include <algorithm>

using namespace std;
void put_in(set<int> &p){
    int q;
    cin>>q;
    while(q --){
        int value;
        cin>>value;
        p.insert(value);
    }
}

void put_out(set<int> &p){
    set<int>::iterator it = p.begin();
    while(it != p.end()){
        cout<<*it<<" ";
        it ++;
    }
}

int main(){
    int T,T1=1;
    cin>>T,T1;
    while(T1 <= T){
        set<int> A,B,RUnion,RIntersec,RDiff1,RDiff2;

        put_in(A);
        put_in(B);

        set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter(RIntersec,RIntersec.begin()));
        set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(RUnion,RUnion.begin()));
        set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(RDiff1,RDiff1.begin()));
        set_difference(B.begin(),B.end(),A.begin(),A.end(),inserter(RDiff2,RDiff2.begin()));

        cout<<"Case #"<<T1 ++<<":"<<endl;
        put_out(RIntersec); cout<<endl;
        put_out(RUnion); cout<<endl;
        put_out(RDiff1); cout<<endl;
        put_out(RDiff2);cout<<endl;
    }

    return 0;
}</span>

法2:

#include <iostream>
#include <set>
#include <algorithm>

using namespace std;
void put_in(set<int> &p){
    int q;
    cin>>q;
    while(q --){
        int value;
        cin>>value;
        p.insert(value);
    }
}

void put_out(set<int> &p){
    set<int>::iterator it = p.begin();
    while(it != p.end()){
        cout<<*it<<" ";
        it ++;
    }
}
void Intersection(set<int> &A,set<int> &B,set<int> &result){
    set<int>::iterator it;

    it = A.begin();
    while(it != A.end()){
        if(B.find(*it) != B.end()) result.insert(*it);
        it++;
    }
}

void Union(set<int> &A,set<int> &B,set<int> &result){
    set<int>::iterator it;

    it = A.begin();
    while(it != A.end()){
        result.insert(*it);
        it++;
    }

    it = B.begin();
    while(it != B.end()){
        result.insert(*it);
        it++;
    }
}

void Difference(set<int> &A,set<int> &B,set<int> &result){
    set<int>::iterator it;

    it = A.begin();
    while(it != A.end()){
        if(B.find(*it) == B.end()) result.insert(*it);
        it++;
    }
}
int main(){
    int T,T1=1;
    cin>>T,T1;
    while(T1 <= T){
        set<int> A,B,RUnion,RIntersec,RDiff1,RDiff2;

        put_in(A);
        put_in(B);

        Intersection(A,B,RIntersec);
        Union(A,B,RUnion);
        Difference(A,B,RDiff1);
        Difference(B,A,RDiff2);

        cout<<"Case #"<<T1 ++<<":"<<endl;
        put_out(RIntersec); cout<<endl;
        put_out(RUnion); cout<<endl;
        put_out(RDiff1); cout<<endl;
        put_out(RDiff2); cout<<endl;
    }

    return 0;
}




C++中,我们可以使用STL(Standard Template Library)提供的容器如set或unordered_set来操作合的交集差集和对称差集。这里简述一下基本的概念: 1. **交集(Intersection)**:两个合的元素都存在的部分,可以使用`std::set_intersection`函数,或者直接用迭代器遍历两个合,比较每个元素是否都在另一个合中。 ```cpp std::set<int> A = {1, 2, 3, 4}; std::set<int> B = {3, 4, 5, 6}; std::set<int> intersection; std::set_intersection(A.begin(), A.end(), B.begin(), B.end(), inserter(intersection, intersection.begin())); ``` 2. **(Union)**:两个合的所有元素合在一起,可以用`std::merge`函数或直接将两个合相加。 ```cpp union(A, B); // 直接赋值操作 intersection.clear(); // 清空交集后添加结果 ``` 3. **(Complement)**:第一个合中不包含在第二个合中的元素,需要创建一个新的合来存储,然后遍历第一个合删除已存在元素。 ```cpp std::vector<int> complement(A.begin(), A.end()); std::set_difference(B.begin(), B.end(), complement.begin(), complement.end(), inserter(complement, complement.begin())); ``` 4. **差集(Difference)**:第一个合中特有的元素,同样需要创建新从第一个合中移除出现在第二个合中的元素。 ```cpp std::set_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(diff, diff.begin())); ``` 5. **对称差集(Symmetric Difference)**:返回两个合中独有的元素,既不在其中一个合中而在另一个合中的元素。 ```cpp std::set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(symmetric_diff, symmetric_diff.begin())); ``` 6. **幂(Power Set)**:生成所有可能的子,包括空和原合本身,这通常通过递归或回溯算法实现,C++标准库没有提供直接操作功能,需要自定义算法。 上述代码展示了基本的操作,实际使用时记得处理可能出现的异常,确保数据类型匹配。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值