博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL源码学习----集合相关算法
阅读量:6908 次
发布时间:2019-06-27

本文共 2795 字,大约阅读时间需要 9 分钟。

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

转载地址:http://sxgdl.baihongyu.com/

你可能感兴趣的文章
linux TCP客户端指定端口号连接服务端
查看>>
CSS3设置Table奇数行和偶数行样式
查看>>
python:大量参数如何传递
查看>>
Javascript下的AJAX
查看>>
Django之路由系统
查看>>
KVM autotest
查看>>
Python语言特性之3:@staticmethod和@classmethod
查看>>
LoadAssetAtPath 与 Load 的区别
查看>>
Code Signal_练习题_Are Similar?
查看>>
定时炸弹--JQuery中的Deferred对象
查看>>
个人项目1——自动生成四则运算
查看>>
COBBLER无人值守安装
查看>>
时间--》梅叔叔
查看>>
如何从dvi生成pdf--------亲测有效果.
查看>>
ViewPager
查看>>
MBR和GPT分区学习
查看>>
鼠标事件-拖拽
查看>>
忘记网站密码了怎么查看(谷歌浏览器)
查看>>
10.属性
查看>>
1.单一职责原则(Single Responsibility Principle)
查看>>