set 相关函数

本篇博客主要讲解 STL 中与 set 有关的算法,分别是交集(set_intersection)、并集(set_union)、差集(set_difference )、对称差集(set_symmetric_difference)
参考资料:cpluscplusSunnylunch
blbagony@163.com
感谢观看,请多多指教

**注意**
1. 使用这四个函数时必须要保证所传集合有序,在后面的解析你会明白为什需要传递有序的集合,使用时需要包 #include <algorithm>

2. 集合中不能有相同元素,不然有些算法执行错误

3. 四个函数的五个参数都是模板参数,每个函数的前四个参数分别是需要比较的集合一和集合二的起始位置和结束位置(左闭右开下同),最后一个参数是保存结果集合的起始位置。

4. 返回值,所得结果集合最后一个元素的位置

set_union

求两个有序集合的并集,函数模板
实例

解题思路:

这里写图片描述

set_intersection

求两个集合交集
实例
解题思路:
这里写图片描述

set_difference

实例
求集合 A 相对于集合 B 中,集合 A 有而集合 B 没有的集合。
这里写图片描述

set_symmetric_difference

求只属于集合 A 且不属于集合 B 或只属于集合 B 不属于集合 A 的集合
实例
解题思路:
这里写图片描述

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

int main()
{

    int first[] = { 5, 10, 10, 15, 20, 25 };
    int second[] = { 50, 40, 20, 30, 20, 10 };
    std::vector<int> v(10);
    std::set<int> s1 = { first, first + sizeof (first) / sizeof (first[0]) };
    std::set<int> s2 = { second, second + sizeof (second) / sizeof (second[0]) };

    std::set<int>::iterator first_1 = s1.begin();
    std::set<int>::iterator first_2 = s2.begin();

    std::set<int>::iterator last_1 = s1.end();
    std::set<int>::iterator last_2 = s2.end();

    /*并集*/
    std::vector<int>::iterator union_it = std::set_union(first_1, last_1, first_2, last_2, v.begin());
    v.resize(union_it - v.begin());
    std::cout << "The union has " << (v.size()) << " elements:\n";
    for (union_it = v.begin(); union_it != v.end(); ++union_it)
        std::cout << ' ' << *union_it;
    std::cout << '\n';
    v.clear();
    v.resize(10);

    /*交集*/
    std::vector<int>::iterator intersection_it = std::set_intersection(first_1, last_1, first_2, last_2, v.begin());
    v.resize(intersection_it - v.begin());
    std::cout << "The intersection has " << (v.size()) << " elements:\n";
    for (intersection_it = v.begin(); intersection_it != v.end(); ++intersection_it)
        std::cout << ' ' << *intersection_it;
    std::cout << '\n';
    v.clear();
    v.resize(10);


    /*差集*/
    std::vector<int> v1(10);
    std::vector<int> v2(10);

    std::vector<int>::iterator diff_it1 = std::set_difference(first_1,last_1, first_2, last_2, v1.begin());
    std::vector<int>::iterator diff_it2 = std::set_difference(first_2, last_2, first_1, last_1, v2.begin());

    v1.resize(diff_it1 - v1.begin());
    std::cout << "Set_1  diff  set_2 " << (v.size()) << " elements:\n";
    for (diff_it1 = v1.begin(); diff_it1 != v1.end(); ++diff_it1)
        std::cout << ' ' << *diff_it1;
    std::cout << '\n';

    v2.resize(diff_it2 - v2.begin());
    std::cout << "Set_1 diff set_2 " << (v.size()) << " elements:\n";
    for (diff_it2 = v2.begin(); diff_it2 != v2.end(); ++diff_it2)
        std::cout << ' ' << *diff_it2;
    std::cout << '\n';
    /*对称差集*/
    std::vector<int>::iterator sym_it = std::set_symmetric_difference(first_1, last_1, first_2, last_2, v.begin());
    v.resize(sym_it - v.begin());
    std::cout << "set_1 and set_2 diff " << v.size() << " element:\n";
    for (sym_it = v.begin(); sym_it != v.end(); ++sym_it)
        std::cout << " " << *sym_it;
    std::cout << '\n';
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值