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

  • 相关阅读:
    会话跟踪之Session
    利用Cookie保存用户身份信息实现免登录
    会话跟踪之Cookie
    JSP的使用
    Servlet的生命周期以及线程安全问题
    将数组转化成递归
    自己配置webpack的vue
    自己配置webpack打包
    echarts堆叠图tooltip中如何仅展示鼠标当前位置相应的指标数据
    富文本编辑器的毛毛雨
  • 原文地址:https://www.cnblogs.com/cobbliu/p/2513971.html
Copyright © 2011-2022 走看看