您的位置:首页 > 理论基础

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

2018-02-04 22:11 169 查看
审核还没通过就更新: )

把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"));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 编程 C++ C 计算机