STL算法---集合算法

23 篇文章 0 订阅
13 篇文章 0 订阅

集合算法


set_union / set_intersection / set_difference / set_symmetric_difference


1. set_union

构造一个有序序列,包含两个序列中所有的不重复元素。
相当于[first1, last1)和[first2, last2)的并集.
重载版本使用自定义的比较操作
函数原形
template<class InIt1, class InIt2, class OutIt> OutIt set_union(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x);
template<class InIt1, class InIt2, class OutIt, class Pred> OutIt set_union(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2,OutIt x, Pred pr);


2. set_intersection

构造一个有序序列,其中元素在两个序列中都存在。
相当于[first1, last1)和[first2, last2)的交集.
重载版本使用自定义的比较操作
函数原形
template<class InIt1, class InIt2, class OutIt> OutIt set_intersection(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);
template<class InIt1, class InIt2, class OutIt, class Pred> OutIt set_intersection(InIt1 first1, InIt1 last1,InIt2 first2,InIt2 last2, OutIt x, Pred pr);


3. set_difference

构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。
相当于[first1, last1) - ([first1, last1)交[first2, last2))
重载版本使用自定义的比较操作
函数原形
template<class InIt1, class InIt2, class OutIt> OutIt set_difference(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);
template<class InIt1, class InIt2, class OutIt, class Pred> OutIt set_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x, Pred pr);


4. set_symmetric_difference

构造一个有序序列,该序列取两个序列的对称差集(并集-交集)
函数原形
template<class InIt1, class InIt2, class OutIt> OutIt set_symmetric_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x);
template<class InIt1, class InIt2, class OutIt, class Pred> OutIt set_symmetric_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x, Pred pr);


/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV2, nV1;
	std::vector<int>::iterator iter;

	
	// 升序
	nV2.clear();
	nV2.push_back(11);
	nV2.push_back(14);
	nV2.push_back(15);
	nV2.push_back(15);
	nV2.push_back(16);

	// 升序
	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(15);
	nV1.push_back(16);
	nV1.push_back(17);

	std::vector<int> nVResult(nV1.size() + nV2.size());	// 这里怎么计算结果的个数?
	// 此时nVResult: 0, 0, 0, 0, 0, 0, 0, 0, 0

	// 并集
	iter = std::set_union(nV1.begin(), nV1.end(), nV2.begin(), nV2.end(), nVResult.begin());
	// 此时nVResult: 11, 14, 15, 15, 16, 17, 0(iter指向这里), 0, 0
	// 结果是: 11, 14, 15, 15, 16, 17

	// 交集
	iter = std::set_intersection(nV1.begin(), nV1.end(), nV2.begin(), nV2.end(), nVResult.begin());
	// 此时nVResult: 14, 15, 16, 15(iter指向这里), 16, 17, 0, 0, 0
	// 结果是: 14, 15, 16

	// [first1, last1) - ([first1, last1)交[first2, last2))
	iter = std::set_difference(nV1.begin(), nV1.end(), nV2.begin(), nV2.end(), nVResult.begin());
	// 此时nVResult: 17, 15(iter指向这里), 16, 15, 16, 17, 0, 0, 0
	// 结果是: 17

	// (并集-交集)
	iter = std::set_symmetric_difference(nV1.begin(), nV1.end(), nV2.begin(), nV2.end(), nVResult.begin());
	// 此时nVResult: 11, 15, 17, 15(iter指向这里), 16, 17,0,0,0
	// 结果是: 11, 15, 17

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值