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源码学习----集合相关算法相关推荐

  1. STL源码剖析 Set相关算法 并集 set_union|交集 set_intersection|差集 set_difference |对称差集 set_symmetric_difference

    注意事项 四种相关算法:并集.交集.差集.对称差集 本章的四个算法要求元素不可以重复并且经过了排序 底层接受STL的set/multiset容器作为输入空间 不接受底层为hash_set和hash_m ...

  2. STL源码剖析 set相关算法

    STL 一共提供了四种与set (集合)相关的算法,分别是并集(union).交集(intersection) > 差集 (difference).对称差集 (symmetricdifferen ...

  3. STL源码学习之空间配置

    STL的空间配置器主要用于内存的分配.填充.释放等操作,在学习它之前,需要深入一点理解new和delete.由于new和delete分两段操作:内存配置和对象构建(析构),本文亦将按此进行分类,其中第 ...

  4. 《STL源码剖析》相关面试题总结

    一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...

  5. Opencascade源码学习之模型算法_TKO模块文件介绍

    Opencascade源码学习之模型数据_TKO模块文件介绍 1.TKO 1.BOPAlgo 2.BOPDS 3.BOPTools 4.BRepAlgoAPI 5.IntTools 1.TKO 1.B ...

  6. STL源码学习(2)-迭代器概念与traits编程技法

    文章首发于:My Blog 欢迎大佬们前来逛逛 文章目录 1. 迭代器设计思维 1.2 迭代器的相应型别 1.3 Traits编程技巧 1.3.1 value_type 1.3.2 deference ...

  7. STL源码剖析 数值算法 copy 算法

    copy复制操作,其操作通过使用assignment operator .针对使用trivial assignment operator的元素型别可以直接使用内存直接复制行为(使用C函数 memove ...

  8. 【STL源码学习】std::list类的类型别名分析

    有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ...

  9. sgi stl源码学习

    c++ stl 源码分析 list类之merge函数 template <class _Tp, class _Alloc> void list<_Tp, _Alloc>::me ...

最新文章

  1. SHOP++ JTM使用帮助
  2. cygwin不能执行make
  3. LINUX修改文件权限 学习
  4. Java中的do-while循环——通过示例学习Java编程(11)
  5. SpringBoot中常见注解
  6. 中国数码单反相机市场趋势报告、技术动态创新及市场预测
  7. Linux 入门笔记
  8. 20165221 JAVA第四周学习心得
  9. 如何解决Mac苹果上运行VMware Fusion虚拟机提示“未找到文件”
  10. C++实现一个基于mfc的学生信息管理系统
  11. 弹出启动windows安全中心服务器,无法启动Windows安全中心服务怎样处理
  12. 一个女程序员的工作感悟
  13. win7删除桌面计算机图标怎么删除,Win7桌面图标箭头怎么去掉?去掉桌面图标箭头的方法...
  14. idea2020版本无法使用actiBPM插件问题
  15. 杂谈:电商平台中的图片资源优化实战
  16. CSAPP导读第3章 程序的机器级表示
  17. 【应急响应】黑客入侵应急分析手工排查
  18. ubuntu上网显示找不到服务器,解决ubuntu中firefox浏览器总是提示找不到服务器的问题...
  19. 【恩墨有约成都站】Kamus和老熊与你相约,不止是技术
  20. 服务器没有自检信息,服务器没内存能自检吗

热门文章

  1. 国外JAVA与IT技术网站地址
  2. c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸
  3. sjms-3 结构型模式
  4. 编译安装mysqld php服务 安装论坛
  5. python numpy读取数据_python使用numpy读取、保存txt数据的实例
  6. python栈与队列的封装
  7. MaxCompute Spark 资源使用优化详解
  8. 阿里云数据库RDS PG联合电商SaaS领导者班牛,助力1500+品牌数智化
  9. SaaS 模式云数据仓库 MaxCompute 数据安全最佳实践
  10. 用科幻艺术描绘未知的魅力-人物篇