STL官网学习笔记——set_intersection
发布于 5 年前 作者 fpeng 819 次浏览 来自 分享

练习题有做到 set_intersection 的相关练习,看别人写的看不懂,就找到了STL的官方文档,翻译加总结如下,如果单纯想要实例,可以去后面直接复制粘贴代码。

STL的地址:http://stlchina.huhoo.net/stl_doc/set_intersection.html

1、set_intersection 是从两个__有序__序列A、B中找到交集(返回结果也是有序的)

2、如果A、B中有多个同样的数,比如A中有3个5,B中有5个5,那么返回结果中有3个5

3、set_intersection 是__稳定__的,它返回的序列元素总是从第一个序列A中复制得到的

4、采用头文件:algorithm

5、set_intersection 从 有序序列__[first1, last1) 和 [first2, last2) __中找到交集,涉及到比较两个对象是否相同,所以设计比较方式的问题。

它提供了两种调用方法,一种是采用默认排序方法, 一种是采用自定义排序方法

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                                InputIterator2 first2, InputIterator2 last2,
                                OutputIterator result);

以上这个方法要求两个序列必须各自是按照升序排序的,比如序列{a, b},必须符合:!(a > b),即 a <= b

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class StrictWeakOrdering>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                                InputIterator2 first2, InputIterator2 last2,
                                OutputIterator result,
                                StrictWeakOrdering comp);

以上这个方法中要求定义的比较操作方法comp必须符合严格弱序(STL根据 !(a comp b) && !(b comp a) 为true的方式来判等)

这个方法要求两个序列必须是按照你自定义的方法来,比如{a, b},必须符合:!comp(a, b),反正记住,comp定义为小于,就是升序了

6、并集的结果不能存入到待比较的序列位置中去,两者不允许重叠

7、实例:

#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;

// 这里是自定义的比较方法,这里自定义的 < 操作符,所以数据应有的序列应该是由小到大 
inline bool lt_nocase(char c1, char c2) { 
    return tolower(c1) < tolower(c2); 
}

int main()
{
    // 这些序列都必须是有序的,按照默认或自定义的比较规则来排序的 
  int A1[] = {1, 3, 5, 7, 9, 11};
  int A2[] = {1, 1, 2, 3, 5, 8, 13};  
  // 这里我稍作了修改,后面你可以看到,从大小写可以看出,取交集的结果是复制于A3而不是A4,set_intersection的稳定性就表现在这里 
  char A3[] = {'a', 'B', 'b', 'B', 'B', 'f', 'h', 'H'};
  char A4[] = {'A', 'B', 'B', 'C', 'D', 'F', 'F', 'H' };

  const int N1 = sizeof(A1) / sizeof(int);
  const int N2 = sizeof(A2) / sizeof(int); 
  const int N3 = sizeof(A3);
  const int N4 = sizeof(A4);

 // 这里调用了 set_intersection 的两种比较方式 
  cout << "Intersection of A1 and A2: ";
  set_intersection(A1, A1 + N1, A2, A2 + N2, ostream_iterator<int>(cout, " "));
  cout << endl << "Intersection of A3 and A4: ";
  set_intersection(A3, A3 + N3, A4, A4 + N4, ostream_iterator<char>(cout, " "), lt_nocase);
  cout << endl;
  
  /*如果数组不是有序的,会出现大问题,A5第一个数是12,比 A6 的所有元素都大
   而且STL是默认为序列从小到大排序的,所以自然不会再去比较 A5 中的其他元素,所以返回的交集为空 */
   int A5[] = {12, 1, 3, 5, 7, 9};
  int A6[] = {1, 1, 2, 3, 5, 8, 11};  
  cout << "Intersection of A5 and A6: ";
  set_intersection(A5, A5 + N1, A6, A6 + N2, ostream_iterator<int>(cout, " "));
} 

运行结果:

回到顶部