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)的联集,每个集合中的元素不必独一无二

  1. 如果某个元素在[first1,last1)出现m次,在[first2,last2)出现n次,在result中出现的次数为max(m,n)
  2. 元素的相对顺序不会被改变,如果是两个集合中都有的元素,那么该元素是从第一个集合中复制来的(去除重复的元素)
  3. 两个集合中的等价元素在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 怎么删除

Python中的iterable该怎么理解

Win10笔记本电脑,无线网显示无Internet,安全,但却是可以用,怎么办?

Inter(R)HD Graphics显卡驱动在那个文件夹,怎么才可以彻底删除

怎么把电信光猫改成桥接模式