STL源码学习----集合相关算法
2012-05-22 22:39
435 查看
STL一共提供了四种与集合相关的算法,分别是并集(union), 交集(intersection),差集(difference),对称差集(symmetric difference)。
这四种集合算法要求处理的两个序列都是非递减有序的,而且处理后的结果集合没有重复的元素。
下面是这四种集合算法的具体实现,为了方便起见,我去掉了模板,集合中的数据类型用int。
1,并集union
2,交集intersection
intersection的实现比较简单,只有s1和s2中两个元素相同的时候才将元素拷贝进result中。
3,差集difference
差集difference构造出集合s1-s2。
4,对称差集symmetric_difference
对称差集返回“属于s1但不属于s2”且“属于s2但不属于s1”的每一个元素。
以上这些算法都不算很难,但是STL以一种统一的编程方式将上面的四种算法高效地实现。值得学习和回味。
这四种集合算法要求处理的两个序列都是非递减有序的,而且处理后的结果集合没有重复的元素。
下面是这四种集合算法的具体实现,为了方便起见,我去掉了模板,集合中的数据类型用int。
1,并集union
void my_union(int *s1, int len1, int *s2, int len2, int *result) { int first1=0, first2=0; while(first1 != len1 && first2 != len2) { if(s1[first1] < s2[first2]){ *result = s1[first1]; first1++; } else if(s1[first1] > s2[first2]){ *result = s2[first2]; first2++; } else{ *result = s1[first1]; first1++; first2++; } result++; } while(first1 != len1) *result++ = s1[first1++]; while(first2 != len2) *result++ = s2[first2++]; }
2,交集intersection
intersection的实现比较简单,只有s1和s2中两个元素相同的时候才将元素拷贝进result中。
void my_intersection(int *s1, int len1, int *s2, int len2, int *result) { int first1=0,first2=0; while(first1 != len1 && first2 != len2) { if(s1[first1] < s2[first2]) first1++; else if(s1[first1] > s2[first2]) first2++; else{ *result++ = s1[first1]; first1++; first2++; } } }
3,差集difference
差集difference构造出集合s1-s2。
void my_difference(int *s1, int len1, int *s2, int len2, int *result) { int first1=0, first2=0; while(first1 != len1 && first2 != len2) { if(s1[first1] < s2[first2]){ *result++ = s1[first1]; first1++; } else if(s1[first1] > s2[first2]) first2++; else{ first1++; first2++; } } while(first1 != len1) *result++ = s1[first1++]; }
4,对称差集symmetric_difference
对称差集返回“属于s1但不属于s2”且“属于s2但不属于s1”的每一个元素。
void my_symm_difference(int *s1, int len1, int *s2, int len2, int *result) { int first1=0,first2=0; while(first1 != len1 && first2 != len2) { if(s1[first1] < s2[first2]){ *result++ = s1[first1]; first1++; } else if(s1[first1] > s2[first2]){ *result++ = s2[first2]; first2++; } else{ first1++; first2++; } } while(first1 != len1) *result++ = s1[first1++]; while(first2 != len2) *result++ = s2[first2++]; }
以上这些算法都不算很难,但是STL以一种统一的编程方式将上面的四种算法高效地实现。值得学习和回味。
相关文章推荐
- 【STL源码学习】STL算法学习之一
- STL源码剖析学习十二:算法之数值算法
- stl中binary_search算法相关学习;
- C++ STL源码学习(基本算法篇)
- 转【STL学习】堆相关算法详解与C++编程实现(Heap)
- 【STL学习】堆相关算法详解与C++编程实现(Heap)
- STL相关算法部分源代码学习
- STL源码剖析学习十七:算法之其他算法
- 与STL文件相关的各类学习地址
- Android系统源码学习相关记录
- C++ STL相关 持续学习中。。。
- C++ Standard Stl -- SGI STL源码学习笔记(02) Concepts Check
- Java集合源码学习(一)集合框架
- 集合源码学习(七):HashMap(Java8)
- 学习STL算法:equal
- STL源码学习----lower_bound和upper_bound算法
- STL源码学习---lower_bound和upper_bound
- STL算法学习小结(转)
- STL查找相关算法
- JAVA学习18_Java集合---HashMap源码剖析