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以一种统一的编程方式将上面的四种算法高效地实现。值得学习和回味。
转载于:https://www.cnblogs.com/cobbliu/archive/2012/05/22/2513971.html
STL源码学习----集合相关算法相关推荐
- STL源码剖析 Set相关算法 并集 set_union|交集 set_intersection|差集 set_difference |对称差集 set_symmetric_difference
注意事项 四种相关算法:并集.交集.差集.对称差集 本章的四个算法要求元素不可以重复并且经过了排序 底层接受STL的set/multiset容器作为输入空间 不接受底层为hash_set和hash_m ...
- STL源码剖析 set相关算法
STL 一共提供了四种与set (集合)相关的算法,分别是并集(union).交集(intersection) > 差集 (difference).对称差集 (symmetricdifferen ...
- STL源码学习之空间配置
STL的空间配置器主要用于内存的分配.填充.释放等操作,在学习它之前,需要深入一点理解new和delete.由于new和delete分两段操作:内存配置和对象构建(析构),本文亦将按此进行分类,其中第 ...
- 《STL源码剖析》相关面试题总结
一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...
- Opencascade源码学习之模型算法_TKO模块文件介绍
Opencascade源码学习之模型数据_TKO模块文件介绍 1.TKO 1.BOPAlgo 2.BOPDS 3.BOPTools 4.BRepAlgoAPI 5.IntTools 1.TKO 1.B ...
- STL源码学习(2)-迭代器概念与traits编程技法
文章首发于:My Blog 欢迎大佬们前来逛逛 文章目录 1. 迭代器设计思维 1.2 迭代器的相应型别 1.3 Traits编程技巧 1.3.1 value_type 1.3.2 deference ...
- STL源码剖析 数值算法 copy 算法
copy复制操作,其操作通过使用assignment operator .针对使用trivial assignment operator的元素型别可以直接使用内存直接复制行为(使用C函数 memove ...
- 【STL源码学习】std::list类的类型别名分析
有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ...
- sgi stl源码学习
c++ stl 源码分析 list类之merge函数 template <class _Tp, class _Alloc> void list<_Tp, _Alloc>::me ...
最新文章
- SHOP++ JTM使用帮助
- cygwin不能执行make
- LINUX修改文件权限 学习
- Java中的do-while循环——通过示例学习Java编程(11)
- SpringBoot中常见注解
- 中国数码单反相机市场趋势报告、技术动态创新及市场预测
- Linux 入门笔记
- 20165221 JAVA第四周学习心得
- 如何解决Mac苹果上运行VMware Fusion虚拟机提示“未找到文件”
- C++实现一个基于mfc的学生信息管理系统
- 弹出启动windows安全中心服务器,无法启动Windows安全中心服务怎样处理
- 一个女程序员的工作感悟
- win7删除桌面计算机图标怎么删除,Win7桌面图标箭头怎么去掉?去掉桌面图标箭头的方法...
- idea2020版本无法使用actiBPM插件问题
- 杂谈:电商平台中的图片资源优化实战
- CSAPP导读第3章 程序的机器级表示
- 【应急响应】黑客入侵应急分析手工排查
- ubuntu上网显示找不到服务器,解决ubuntu中firefox浏览器总是提示找不到服务器的问题...
- 【恩墨有约成都站】Kamus和老熊与你相约,不止是技术
- 服务器没有自检信息,服务器没内存能自检吗