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

  • 相关阅读:
    洛谷P2805 植物大战僵尸
    洛谷P4307 球队收益
    bzoj4842 Delight for a Cat
    洛谷P2053 修车
    bzoj2561 最小生成树
    bzoj3114 LCM Pair Sum
    洛谷P4486 Kakuro
    bzoj3698 XWW的难题
    关于oracle数据库
    toString方法的用法
  • 原文地址:https://www.cnblogs.com/cobbliu/p/2513971.html
Copyright © 2011-2022 走看看