首页 > 代码库 > STL源码剖析 算法 set
STL源码剖析 算法 set
本文为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) 次
图 6-5a
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) 次
图6-5b
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) 次
图6-5c
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| 次
图6-5d
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)); }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。