set并集和交集&宏定义&typedef

审核还没通过就更新: )
把set_difference()这家伙给忘掉了
已补充
<———————————————–>

看紫书P116, 发现这里的代码出现了几个没看过的函数, 百度了一下, 还真有, 而且用法比较奇特.

紫书上使用宏(macro)很巧妙, 以前这样没用过
typedef也给我减少写代码提供了新思路

主角是set相关的函数

取两集合并集: set_union()
取两集合交集: set_intersection()
取第一集合对第二集合的差集:;set_difference()

要包含头文件algorithm

函数的参数分别是

set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3, s3.begin());

以上, 把集合是s1, s2取并集, 放到集合s3中

还有一种直接输出, 可设置元素间字符的

set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), ostream_iterator< int>(cout,”\n”));

要包含iterator头文件

set_intersection函数与set_difference函数用法和set_union几乎是一样的

值得注意的是
这样写参数比较繁琐, 所以不如使用宏定义简化使用函数过程中的参数

#define seT(x) x.begin(), x.end()
#define sEt(x) inserter(x, x.begin())
或者更集中
#define seT(x, y) x.begin(), x.end(), y.begin(), y.end()

使用typedef简化类型, 或者说使类型更常规

typedef set< int > Set;

示例一

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

using namespace std;

typedef set<int> Set;

int main()
{
    Set s1, s2, s3;
    for(int i = 0; i < 10; ++i) {
        s1.insert(i);
        s2.insert(i + 4);
    }
    set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3, s3.begin()));
    set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3, s3.begin()));
    Set::iterator it = s3.begin();
    while(it != s3.end()) {
        cout << *it << endl;
        it++;
    }
}

示例二

#include <iostream>
#include <iterator>
#include <algorithm>
#include <set> 
using namespace std;

#define seT(x) x.begin(), x.end()
#define sEt(x) inserter(x, x.begin())
#define sET ostream_iterator<int>(cout, "\n")

typedef set <int> Set;

int main()
{
    Set s1, s2, s3;
    for( int i = 0; i < 10; ++i ) {
        s1.insert(i);
        s2.insert(i+7); 
    }
    set_union(seT(s1), seT(s2), sEt(s3));
    Set :: iterator it = s3.begin();
    while(it != s3.end()) {
        cout << *it << endl;
        it++; 
    }
    cout << endl;
    set_intersection(seT(s1), seT(s2), sET);
}

示例三

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

using namespace std;

#define seT(x, y) x.begin(), x.end(), y.begin(), y.end()
#define sET ostream_iterator<int>(cout, "\n")
typedef set<int> Set;

int main()
{
    Set s1, s2;
    for(int i = 0; i < 10; ++i) {
        s1.insert(i-3);
        s2.insert(i+2);
    }
    set_intersection(seT(s1, s2), sET);
}

示例四

#include <iostream>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;

#define SET(x) x.begin(), x.end()

int main()
{
    typedef set<int> Set;
    Set s1, s2, s3;
    for( int i = 0; i < 10; ++ i ) {
        s1.insert(i+1);
        s2.insert(i+3);
    }
    set_difference(SET(s1), SET(s2), inserter(s3, s3.begin()));
    set_difference(SET(s1), SET(s2), ostream_iterator<int>(cout, "\n"));
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值