练习题有做到 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, " "));
}
运行结果: