STL 算法vector/set集合-交集,并集,差集,对称差
2014-12-26 21:13
477 查看
针对这里提及的四个集合运算必须特别注意:
1、第一个算法需保证第一集合和第二集合有序,并从小到大排序,内部使用默认“<”操作符比较元素大小;
2、第二个算法需保证第一集合和第二集合有序,排序方式参照Compare确定,内部使用Compare比较元素大小。
1 -- set_intersection(交集)
该函数用于求两个集合的交集,结果集合中包含所有同时属于第一个集合和第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的交集为{3,7}。
函数返回值:结果集合的结束位置的back_insert_iterator(和普通的迭代器不样)。
参数:
(第一个集合的开始位置,第一个集合的结束位置,第二个参数的开始位置,第二个参数的结束位置,结果集合的插入迭代器(inserter(result,
result.begin())))
对于第二个算法,Compare指定用于比较元素大小的仿函数。
2
-- set_union(并集)
该函数用于求两个集合的交集,结果集合中包含所有同时属于第一个集合和第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的并集为{1,2,3,4,5,7}。
3
-- set_difference(差集)
4
-- set_symeetric_difference(对称差集)
应用举例(以并集为例):
第一类--两个数组求并:
第二类两个set求并:
第三类--两个vector之间求并:
注意事项:函数参数的最后一个参数是插入迭代器,是因为这个函数内部有对结果集合的插入过程,必须用到插入函数,若不需要插入就用普通迭代器即可,就提前就把结果集合的内存空间扩大。
比如:
若改为c(3)会出现3个元素,最后RE。
此时函数的最后一个参数是普通迭代器,函数的返回值也不再是插入迭代器,也变成了普通迭代器(指向结果集合的最后一个插入元素(非0的))
比如:
所以求结果集合的元素个数除了用result.size()以外,也可以用以上程序的方法,不过建议还是用插入迭代器,用result.size()毕竟用普通迭代器的问题范围小,而且不方便(我们可能不想去预知结果集合的大小)。
1、第一个算法需保证第一集合和第二集合有序,并从小到大排序,内部使用默认“<”操作符比较元素大小;
2、第二个算法需保证第一集合和第二集合有序,排序方式参照Compare确定,内部使用Compare比较元素大小。
1 -- set_intersection(交集)
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
该函数用于求两个集合的交集,结果集合中包含所有同时属于第一个集合和第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的交集为{3,7}。
函数返回值:结果集合的结束位置的back_insert_iterator(和普通的迭代器不样)。
参数:
(第一个集合的开始位置,第一个集合的结束位置,第二个参数的开始位置,第二个参数的结束位置,结果集合的插入迭代器(inserter(result,
result.begin())))
对于第二个算法,Compare指定用于比较元素大小的仿函数。
2
-- set_union(并集)
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
该函数用于求两个集合的交集,结果集合中包含所有同时属于第一个集合和第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的并集为{1,2,3,4,5,7}。
3
-- set_difference(差集)
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 该函数用于求两个集合的差集,结果集合中包含所有属于第一个集合但不属于第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的差集为{1,2,9}。该函数用于求两个集合的差集,结果集合中包含所有属于第一个集合但不属于第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的差集为{1,2,9}。
4
-- set_symeetric_difference(对称差集)
template<class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);数学上,两个集合的对称差集是只属于其中一个集合,而不属于另一个集合的元素组成的集合。也就是说对称差集是去除同时出现在两个集合中的元素后,两集合其他元素组成的集合。例如:集合{1,2,3,7,9}和{3,4,5,7}的对称差为{1,2,4,5,9}。集合论中的这个运算相当于布尔逻辑中的异或运算。集合A和B的对称差通常表示为AΔB。
应用举例(以并集为例):
第一类--两个数组求并:
// set_union example #include <iostream> #include <algorithm> #include <vector> using namespace std; int main () { int first[] = {5,10,15,20,25}; int second[] = {50,40,30,20,10}; vector<int> v; // 也可以用set<int> // 0 0 0 0 0 0 0 0 0 0 vector<int>::iterator it; sort (first,first+5); // 5 10 15 20 25 sort (second,second+5); // 10 20 30 40 50 set_union (first, first+5, second, second+5, inserter(v, v.begin())); // 5 10 15 20 25 30 40 50 0 0 for(vector<int>::iterator it=v.begin();it!=v.end();it++) cout<<*it<<" "; return 0; }
第二类两个set求并:
#include <set> #include <iterator> #include <iostream> #include <algorithm> using namespace std; int main(void) { set<int> a,b,c; //c也可以定义成vector a.insert(1); a.insert(6); a.insert(6); b.insert(2); b.insert(6); b.insert(9); //最后一个参数若使用c.begin()会产生编译错误assignment of read-only localtion. set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin())); for(set<int>::iterator it=c.begin();it!=c.end();it++) cout<<*it<<" "; return 0; }
第三类--两个vector之间求并:
#include <vector> #include <iterator> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int> a,b,c; for(int e=0;e<10;e++) { a.push_back(e); b.push_back(e+5); } //最后一个参数若使用c.begin(),运行时会出错“Segmentation fault (core dumped)”. set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c, c.begin())); for(vector<int>::iterator it=c.begin();it!=c.end();it++) cout<<*it<<" "; return 0; }
注意事项:函数参数的最后一个参数是插入迭代器,是因为这个函数内部有对结果集合的插入过程,必须用到插入函数,若不需要插入就用普通迭代器即可,就提前就把结果集合的内存空间扩大。
比如:
#include <vector> #include <iterator> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int> a,b,c(20); //初始化c中有20个0 for(int e=0;e<10;e++) { a.push_back(e); b.push_back(e+5); } //最后一个参数若使用c.begin(),运行时会出错“Segmentation fault (core dumped)”. set_union(a.begin(),a.end(),b.begin(),b.end(),c.begin()); for(vector<int>::iterator it=c.begin();it!=c.end();it++) cout<<*it<<" "; return 0; }
若改为c(3)会出现3个元素,最后RE。
此时函数的最后一个参数是普通迭代器,函数的返回值也不再是插入迭代器,也变成了普通迭代器(指向结果集合的最后一个插入元素(非0的))
比如:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main () { int first[] = {5,10,15,20,25}; int second[] = {50,40,30,20,10}; vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0 vector<int>::iterator it; sort (first,first+5); // 5 10 15 20 25 sort (second,second+5); // 10 20 30 40 50 it=set_union (first, first+5, second, second+5,v.begin());// 5 10 15 20 25 30 40 50 0 0 //如果v.begin()改成inserter(v, v.begin()),函数返回值是插入迭代器,就会出现编译错误,错误信息: /*E:\Users\amdi\Desktop\zuoye.cpp|165|error: no match for 'operator=' (operand types are 'std::vector<int>::iterator { aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and 'std::insert_iterator<std::vector<int> >')| */ cout << "union has " << int(it - v.begin()) << " elements.\n"; return 0; }
所以求结果集合的元素个数除了用result.size()以外,也可以用以上程序的方法,不过建议还是用插入迭代器,用result.size()毕竟用普通迭代器的问题范围小,而且不方便(我们可能不想去预知结果集合的大小)。
相关文章推荐
- STL算法-交集,并集,差集,对称差
- STL算法-交集,并集,差集,对称差
- STL算法-交集,并集,差集,对称差
- STL算法交集、并集、差集
- 用C++标准库算法求两个集合的交集、并集、差集
- STL集合的并集、交集、差集、对称差集
- SQL集合运算:差集、交集、并集
- Oracle集合运算符 交集 并集 差集
- C++数据结构——埃拉托斯特尼筛法以及求集合的交集,并集,差集
- 两个数组并集 交集 差集的算法思想与实现
- 集合的交集并集差集
- 获取两个DataTable之间的差集、交集、并集集合(Except、Intersect、Union)
- 输入集合A、B和全集C,求两集合的交集、并集、补集、差集
- SQL集合运算 差集 并集 交集
- STL之交集、并集、差集
- 构建一个类,对集合进行运算,包括求集合的交集,并集和差集。
- 求两个数组的交集、并集和差集算法分析与实现
- 求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)
- STL容器[28]交集、并集、差集
- 集合运算—union(并集)、intersect(交集)和except(差集)