STL源码剖析 算法 set
来源:互联网 发布:值得买的电子产品知乎 编辑:程序博客网 时间:2024/06/05 06:21
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
set相关算法
------------------------------------------------------------------------------------描述:
set_union , set_difference , set_intersection , set_symmetric_difference 算法接受的 set ,
必须是有序区间,适用于以 RB-tree 为底层的 set/multiset , 不适用于以 hash 为底层的 hash_set/hash_multiset
当然也适用于非 set/multiset 的其它有序区间,只要有序就可以了
源码:
set_union
构造 S1 、 S2 的并集,如果某个值在 S1 出现 n 次,在 S2 出现 m 次,那么该值在输出区间中会出现 max(m, n) 次
template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { //当两区间都尚未到达尾端时,执行以下操作 while (first1 != last1 && first2 != last2) { //两元素不等,取较小元素,并前移较小元素所在区间的迭代器 if (*first1 < *first2) { *result = *first1; ++first1; } else if (*first2 < *first1) { *result = *first2; ++first2; }//两元素相等,取S1元素,移动两个区间的迭代器 else { *result = *first1; ++first1; ++first2; }//移动结果区间的迭代器 ++result; } //只要有一个区间到达尾端,就结束上述的 while 循环,然后将未到达尾端的 //区间的所有元素拷贝到目的端 return copy(first2, last2, copy(first1, last1, result));}
set_intersection
构造 S1 、S2 的交集,如果某个值在 S1 出现 n 次,在 S2 出现 m 次,那么该值在输出区间中会出现 min(m, n) 次
template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { //当两个区间都尚未到达尾端时,执行以下操作 while (first1 != last1 && first2 != last2) //前移较小元素区间的迭代器直到有元素相同 if (*first1 < *first2) ++first1; else if (*first2 < *first1) ++first2;//两区间元素值相同 else { *result = *first1; ++first1; ++first2; ++result; } return result;}
set_difference
构造 S1 、S2 的差集,如果某个值在 S1 出现 n 次,在 S2 出现 m 次,那么该值在输出区间中会出现 min(n-m, 0) 次
template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { //当两个区间都尚未到达尾端时,执行以下操作 while (first1 != last1 && first2 != last2) //当S1 元素小于 S2元素,取 S1 元素 if (*first1 < *first2) { *result = *first1; ++first1; ++result; }//当S1 元素大于 S2元素,前移 S2 迭代器 else if (*first2 < *first1) ++first2;//当S1、S2 元素相等,前移 S1、S2 两个迭代器 else { ++first1; ++first2; } //如果是 S2 先结束,还要复制 S1 剩下的元素 return copy(first1, last1, result);}
set_symmetric_difference --> 出现于 S1 但不出现于 S2 及 出现于 S2 但不出现于 S1
构造 S1 、S2 的对称差集,如果某个值在 S1 出现 n 次,在 S2 出现 m 次,那么该值在输出区间中会出现 |n-m| 次
template <class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { //当两区间都尚未到达尾端时,执行以下操作 while (first1 != last1 && first2 != last2) //当S1的元素小于S2的元素,取S1的元素if (*first1 < *first2) { *result = *first1; ++first1; ++result; }//当S2的元素小于S1的元素,取S2的元素 else if (*first2 < *first1) { *result = *first2; ++first2; ++result; }//相等时,两个元素都不取 else { ++first1; ++first2; } return copy(first2, last2, copy(first1, last1, result));}
1 0
- STL源码剖析 算法 set
- STL源码剖析——set相关算法
- STL 之 set 源码剖析
- STL源码剖析——STL算法之set集合算法
- 【STL源码剖析】Sort算法
- STL源码剖析——set
- STL源码剖析 - 第6章 算法(algorithms) - set相关算法
- 【STL源码剖析读书笔记】【第6章】算法之set相关算法
- 《STL源码剖析》学习笔记-第6章(一) set相关算法
- STL源码剖析之六:算法
- STL源码剖析 笔记之六 算法
- STL源码剖析学习之数值算法
- STL源码剖析学习之基本算法
- STL 源码剖析 算法 stl_numeric.h
- STL 源码剖析 算法 stl_numeric.h -- copy
- STL 源码剖析 算法 stl_algobase.h
- STL 源码剖析 算法 stl_algo.h -- merge
- STL 源码剖析 算法 stl_algo.h -- partition
- IOCP一:AcceptEx
- ZOJ 3787 Access System 模拟
- 界面超漂亮的桌面时钟
- 固定DIV不随滚动条滚动
- 卖票
- STL源码剖析 算法 set
- 查询oracle隐含参数
- 最长不下降子序列
- hdu 1198(再续并查集)
- Android无法访问本地服务器(localhost)的解决方案
- Xilinx FPGA的约束设计和时序分析总结 (转)
- 关于计算数学多项式的代码
- peewee连接mysql中文数据编码
- vc 复制和删除指定的文件和文件夹