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"));
}
#ifndef _LINKSET_H_ #define _LINKSET_H_ #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef int DataType; struct node { DataType element; struct node *next; }; typedef struct node * SET; void insert(DataType datax, SET set); /* 函数名: InitSet 函数功能:根据参数num,初始化合 函数参数:合元素的个数 返回值:合头指针 */ SET InitSet(int num) { SET p; p = ( struct node *)malloc(sizeof(struct node)) ; p-&gt;next = NULL; p-&gt;element = num; int temp; for(int i =0;i&lt;num;i++) { scanf(&quot;%d&quot;,&amp;temp); insert(temp, p); //调用insert函数,将输入数据插入合 } return p; } /* 函数名: find 函数功能:在合中查找值为datax的成员 函数参数:datax:待查找的值 ; set合的头结点 返回值:找到值为datax的成员返回1,否则返回0 */ int find(DataType datax, SET set) { //请在此处填写代码,在set合中查找值为datax的成员,若找到返回1,否则返回0 /********** Begin **********/ /********** End **********/ } /* 函数名: insert 函数功能:在set中插入值为datax的成员 ,插入位置在表头 函数参数:datax:待插入的值 ; set合的头结点 返回值:无 时间复杂度:O(1) */ void insert(DataType datax, SET set) { //请在此处填写代码,将datax插入set, 注意因合元素是无序的,只需将新成员插入表头 /********** Begin **********/ /********** End **********/ } /* 函数名: copyList 函数功能:将setA复制生成setB 函数参数:setA 、setB的头结点 返回值:无 */ void copySet(SET setA, SET setB) { //请在此处填写代码,实现将setA的成员复制到setB的功能 /********** Begin **********/ /********** End **********/ } /* 函数名: printSet 函数功能:输出合的元素,以空格作为元素之间分界符 函数参数:set的头结点 返回值:无 */ void printSet(SET set) { //请在此处填写代码,实现输出合元素的功能,元素之间以空格为分界符 /********** Begin **********/ /********** End **********/ } /* 函数名: setUnion 函数功能:求两个setA setB的 函数参数:setAsetB的头结点 返回值:合的头结点 */ SET setUnion(SET setA ,SET setB) { //请在此处填写代码,可直接使用上面已经实现的各操作 /********** Begin **********/ /********** End **********/ } /* 函数名: setIntersect 函数功能:求两个setA setB的交集 函数参数:setAsetB的头结点 返回值:交集合的头结点 */ SET setIntersect(SET setA ,SET setB) { //请在此处填写代码,可直接使用上面
最新发布
03-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值