set的键是自动排序的,对应的求并集差集交集都可以用到这个有序的特性,时间复杂度都为O(m+n),m,n分别为两个容器的大小
1.set_union可以用来求两个集合的并集,它是一种稳定的操作,因为元素间的相对位置不会改变。
源码如下:
template <class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_union(InputIterator1 first1,InputIterator1 last1, InputIterator2 first2,InputIterator2 last2, OutputIterator result) { while(first1!=last1&&first2!=last2) { if (*first1<*first2) { *result=*first1; ++first1; } else if(*first1>*first2) { *result=*first2; ++first2; } else //相等的情况 { *result=*first1; ++first1; ++first2; } ++result; } return copy(first2,last2,copy(first1,last1,result)); }2.set_intersection可以用来求两个集合的交集
源码如下:
template <class InputIterator1,class InputIterator2,class OutputIterator > OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1, InputIterator2 first2,InputIterator2 last2, OutputIterator result) { while(first1!=last1&&first2!=last2) { if(*first1<*first2) { ++first1; } else if(*first1>*first2) { ++first2; } else { //*first1==*first2,这个元素是交集的元素 *result=*first1; ++first1; ++first2; ++result; } } return result; }
源码如下:
template <class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_difference(InputIterator1 first1,InputIterator1 last1, InputIterator2 first2,InputIterator2 last2, OutputIterator result) { while(first1!=last1&&first2!=last2) { if(*first1<*first2) //*first1<*first2,这个元素是差集的元素 { *result=*first1; ++first1; ++result; } else if(*first1>*first2) ++first2; else { ++first1; ++first2; } } return copy(first1,last1,result); }
简单的测试:
# include <iostream> # include <cstdlib> # include <set> # include <algorithm> # include <vector> using namespace std; int main() { set<int> s1,s2; s1.insert(1); s1.insert(2); s1.insert(3); s2.insert(2); s2.insert(3); s2.insert(4); set<int>::iterator iter1=s1.begin(); set<int>::iterator iter2=s1.end(); set<int>::iterator iter3=s2.begin(); set<int>::iterator iter4=s2.end(); vector<int> res(10,0); vector<int>::iterator iter; iter=set_union(iter1,iter2,iter3,iter4,res.begin()); //并集 //iter=set_intersection(iter1,iter2,iter3,iter4,res.begin()); //交集 //iter=set_difference(iter1,iter2,iter3,iter4,res.begin()); //差集 res.resize(iter-res.begin()); for(iter=res.begin();iter!=res.end();++iter) { cout<<*iter<<endl; } system("pause"); return 0; }
原文地址:http://blog.csdn.net/u011608357/article/details/39122661