STL一共提供了四种与集合相关的算法,分别是并集(union), 交集(intersection),差集(difference),对称差集(symmetric difference)。
这四种集合算法要求处理的两个序列都是非递减有序的,而且处理后的结果集合没有重复的元素。
下面是这四种集合算法的具体实现,为了方便起见,我去掉了模板,集合中的数据类型用int。
1,并集union
1 void my_union(int *s1, int len1, 2 int *s2, int len2, 3 int *result) 4 { 5 int first1=0, first2=0; 6 7 while(first1 != len1 && first2 != len2) 8 { 9 if(s1[first1] < s2[first2]){10 *result = s1[first1];11 first1++;12 }13 else if(s1[first1] > s2[first2]){14 *result = s2[first2];15 first2++;16 }17 else{18 *result = s1[first1];19 first1++;20 first2++;21 }22 result++;23 }24 25 while(first1 != len1)26 *result++ = s1[first1++];27 while(first2 != len2)28 *result++ = s2[first2++];29 }
2,交集intersection
intersection的实现比较简单,只有s1和s2中两个元素相同的时候才将元素拷贝进result中。
1 void my_intersection(int *s1, int len1, 2 int *s2, int len2, 3 int *result) 4 { 5 int first1=0,first2=0; 6 7 while(first1 != len1 && first2 != len2) 8 { 9 if(s1[first1] < s2[first2])10 first1++;11 else if(s1[first1] > s2[first2])12 first2++;13 else{14 *result++ = s1[first1];15 first1++;16 first2++;17 }18 }19 }
3,差集difference
差集difference构造出集合s1-s2。
1 void my_difference(int *s1, int len1, 2 int *s2, int len2, 3 int *result) 4 { 5 int first1=0, first2=0; 6 7 while(first1 != len1 && first2 != len2) 8 { 9 if(s1[first1] < s2[first2]){10 *result++ = s1[first1];11 first1++;12 }13 else if(s1[first1] > s2[first2])14 first2++;15 else{16 first1++;17 first2++;18 }19 }20 21 while(first1 != len1)22 *result++ = s1[first1++];23 }
4,对称差集symmetric_difference
对称差集返回“属于s1但不属于s2”且“属于s2但不属于s1”的每一个元素。
1 void my_symm_difference(int *s1, int len1, 2 int *s2, int len2, 3 int *result) 4 { 5 int first1=0,first2=0; 6 7 while(first1 != len1 && first2 != len2) 8 { 9 if(s1[first1] < s2[first2]){10 *result++ = s1[first1];11 first1++;12 }13 else if(s1[first1] > s2[first2]){14 *result++ = s2[first2];15 first2++;16 }17 else{18 first1++;19 first2++;20 }21 }22 23 while(first1 != len1)24 *result++ = s1[first1++];25 while(first2 != len2)26 *result++ = s2[first2++];27 }
以上这些算法都不算很难,但是STL以一种统一的编程方式将上面的四种算法高效地实现。值得学习和回味。