STL算法---集合算法

集合算法


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;
}
相关文章
相关标签/搜索