STL源码学习----集合相关算法

  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以一种统一的编程方式将上面的四种算法高效地实现。值得学习和回味。

你可能感兴趣的:(STL)