本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
set相关算法
------------------------------------------------------------------------------------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)); }
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; }
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); }
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)); }