set_intersection怎么用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了set_intersection怎么用?相关的知识,希望对你有一定的参考价值。
我现在有两个已经排序好的整形数组A[]和B[],但是均未知大小,,怎样将A和B的交集元素输出到数组C中?不知道set_intersection这个函数要怎么写,,,,
是C++ STL里面的set_intersection吗? 如果是很简单,参考下面的代码。 用vector和相应的iterator。 结果保留在vector中,然后把vector转换到数组中(需要保证数组长度足够)。
#include <iostream>#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, char** argv)
int A[] = 5,10,15,20,25;
int B[] = 50,40,30,20,10;
int C[10] = 0;
size_t size_A, size_B, size_C;
vector<int> v;
vector<int>::iterator it;
// Calculate the size of all arrays.
size_A = sizeof(A)/sizeof(A[0]);
size_B = sizeof(B)/sizeof(B[0]);
size_C = sizeof(C)/sizeof(C[0]);
// Resize vector since it doesn't specify when declaring.
// Sort the vector(s) if applicable.
v.resize(size_A+size_B);
sort (A, A + size_A);
sort (B, B + size_B);
// Get Intersection of 2 sets, and resize it!
it = set_intersection (A, A+size_A, B, B+size_B, v.begin());
v.resize(it-v.begin());
// Print out results.
cout << "The intersection has " << (v.size()) << " elements:" << endl;
for (it=v.begin(); it!=v.end(); ++it)
cout << ' ' << *it;
cout << endl;
// Now converting vector to array.
if (size_C < v.size())
cout << "Array C is too small." << endl;
else
copy(v.begin(), v.end(), C);
cout << "The array of C is:" << endl;
for (int i = 0; i < v.size(); i ++)
cout << ' ' << C[i];
cout << endl;
return 0;
参考技术A 双重循环,
例如,外层循环对数组A进行遍历,内层遍历B与A进行比较,如果相等了,则记录到C。
int k = 0;
for (i=0; i<sizeof(A); i++)
for (j=0; j<sizeof(B); j++)
if (A[i] == B[j])
C[k++] = A[i];
break;
追问
恩,这个我会,想用set_intersection。同样感谢
includes,set_union,set_intersection,set_difference
includes
//版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2> bool includes(InputerIterator1 first1,InputerIterator1 last1,InputerIterator2 first2,InputerIterator2 last2); //版本二:用自定义的function object比较元素 template <class InputerIterator1,class InputerIterator2,class StrictWeakOrdering> bool includes(InputerIterator1 first1,InputerIterator1 last1,InputerIterator2 first2,InputerIterator2 last2,StrictWeakOrdering cmp);
测试已排序的[first2,last2)是否为[first1,last1)的子集,每个集合中的元素不必独一无二,如果某个元素在[first1,last1)出现m次,在[first2,last2)出现n次,如果m<n,则返回false
set_union
//版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator> OutputIterator set_union(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult); //版本二:用自定义的function object比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering> OutputIterator set_union(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2, OutputIterator result,StrictWeakOrdering cmp);
构造已排序的[first2,last2)和[first1,last1)的联集,每个集合中的元素不必独一无二
- 如果某个元素在[first1,last1)出现m次,在[first2,last2)出现n次,在result中出现的次数为max(m,n)
- 元素的相对顺序不会被改变,如果是两个集合中都有的元素,那么该元素是从第一个集合中复制来的(去除重复的元素)
- 两个集合中的等价元素在result中,m个元素是从第一个range中复制来的,max(n-m,0)个元素从第二个range中复制来
set_intersection
//版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator> OutputIterator set_intersection(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult); //版本二:用自定义的function object比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering> OutputIterator set_intersection(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2, OutputIterator result,StrictWeakOrdering cmp);
构造两个集合的交集
如果某个元素在[first1,last1)出现n次,在[first2,last2)出现m次,在result中出现的次数为min(n,m),所有元素赋值于[first1,last1),其他的与set_union相同
set_difference
//版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator> OutputIterator set_difference(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult); //版本二:用自定义的function object比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering> OutputIterator set_difference(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2, OutputIterator result,StrictWeakOrdering cmp);
构造两个集合的差集,result中的元素出现于第一个range但不出现于第二个range
某个元素在[first1,last1)中拥有n个彼此等价的元素,在[first2,last2)中拥有m个彼此等价的元素,result中含有max(n-m)个彼此等价的元素,所有元素都复制于[first1,last1)
set_symmetric_difference
//版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator> OutputIterator set_symmetric_difference(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult); //版本二:用自定义的function object比较元素 template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering> OutputIterator set_symmetric_difference(InputerIterator1 first1,InputerIterator1 last1, InputerIterator2 first2,InputerIterator2 last2, OutputIterator result,StrictWeakOrdering cmp);
构造出两个集合之对称差,结果集包含出现于第一个range的元素但不出现于第二个range的元素以及出现于第二个range的元素但不出现于第一个range的元素
某个元素在[first1,last1)中拥有n个彼此等价的元素,在[first2,last2)中拥有m个彼此等价的元素,result中含有|n-m|个彼此等价的元素,若n>m,则result元素中最后n-m个将由[first1,last1)复制来,若n<m,则result元素中最后m-n个将由[first2,last2)复制来
#include <iostream> #include <vector> #include <iterator> #include <algorithm> using namespace std; int main() { vector<int> v{1,2,3,4,5,6,6,6}; vector<int> v1{1,5,6}; vector<int> v2{1,9,10,11}; cout<<includes(v.begin(),v.end(),v1.begin(),v1.end())<<endl; set_union(v2.begin(),v2.end(),v1.begin(),v1.end(),ostream_iterator<int>(cout," ")); cout<<endl; set_intersection(v.begin(),v.end(),v1.begin(),v1.end(),ostream_iterator<int>(cout," ")); set_difference(v1.begin(),v1.end(),v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; set_symmetric_difference(v.begin(),v.end(),v2.begin(),v2.end(),ostream_iterator<int>(cout," ")); cout<<endl; return 0; }
以上是关于set_intersection怎么用?的主要内容,如果未能解决你的问题,请参考以下文章
set_difference、set_intersection 和 set_union 的就地版本
inter composer xe 2011 update 怎么删除
Win10笔记本电脑,无线网显示无Internet,安全,但却是可以用,怎么办?