1、set_uinon。即求两集合之并集。注意到两个set集合必须是有序的。
实现:
template<typename _InputIterator1, typename _InputIterator2,
typename _OutputIterator,
typename _Compare>
_OutputIterator
__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result, _Compare __comp)
{
while (__first1 != __last1 && __first2 != __last2) //两个集合均未走完
{
if (__comp(__first1, __first2)) //迭代器指向的序列一当前的值较小,将序列一的元素插入,序列一的迭代器前进一
{
*__result = *__first1;
++__first1;
}
else if (__comp(__first2, __first1)) //迭代器指向的序列二当前的值较小,将序列二的元素插入,序列二的迭代器前进一
{
*__result = *__first2;
++__first2;
}
else //迭代器指向的两个序列的元素一样大,将序列一的当前元素插入,两个迭代器同时前进
{
*__result = *__first1;
++__first1;
++__first2;
}
++__result;
}
return std::copy(__first2, __last2,
std::copy(__first1, __last1, __result));//未走完的序列紧接着复制到并集后面
}
图示:
2、set_intersection。求两个集合的交集。注意到两个set集合必须是有序的。
实现:
template<typename _InputIterator1, typename _InputIterator2,
typename _OutputIterator,
typename _Compare>
_OutputIterator
__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result, _Compare __comp)
{
while (__first1 != __last1 && __first2 != __last2) //两个set集合均未走完
if (__comp(__first1, __first2))
++__first1;
else if (__comp(__first2, __first1))
++__first2;
else
{
*__result = *__first1; //相同的元素纪录于目标区,再继续前进,直到有集合走完
++__first1;
++__first2;
++__result;
}
return __result;
}
3、set_difference。构造两个集合set1与set2的差集,也就是说构造出来的集合属于集合1而不属于集合2。注意两个set必须之前就有序。
实现:
template<typename _InputIterator1, typename _InputIterator2,
typename _OutputIterator,
typename _Compare>
_OutputIterator
__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result, _Compare __comp)
{
while (__first1 != __last1 && __first2 != __last2)
if (__comp(__first1, __first2)) //set一集合的当前元素小于set二集合的当前元素,则说明,set一当前的元素是独一无二的,存入结果,序列一的迭代器前进一
{
*__result = *__first1;
++__first1;
++__result;
}
else if (__comp(__first2, __first1)) //set一的当前迭代器所指之元素大于set二当前迭代器所指之元素,set二迭代器前进一
++__first2;
else //set一与set二两者的迭代器所指元素相等,两者的迭代器同时前进一
{
++__first1;
++__first2;
}
return std::copy(__first1, __last1, __result);//若set一未走完,则将set一之剩余元素copy到result
}
运行图示:
4、set_symmetric_difference。求两个set的对称差集,也就是,set_difference(s1,s2)∪set_difference(s2,s1)。
实现:
template<typename _InputIterator1, typename _InputIterator2,
typename _OutputIterator,
typename _Compare>
_OutputIterator
__set_symmetric_difference(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_OutputIterator __result,
_Compare __comp)
{
while (__first1 != __last1 && __first2 != __last2)
if (__comp(__first1, __first2)) //set一集合的当前元素较小,将set一集合的当前元素插入结果集,set一的迭代器前进一
{
*__result = *__first1;
++__first1;
++__result;
}
else if (__comp(__first2, __first1))//set二集合的当前元素较小,讲set二集合的当前元素插入结果集,set二的迭代器前进一
{
*__result = *__first2;
++__first2;
++__result;
}
else //set一迭代器当前所指元素与set二迭代器当前所指元素相等,两个set的迭代器均前进一
{
++__first1;
++__first2;
}
return std::copy(__first2, __last2,
std::copy(__first1, __last1, __result)); //两个set中未走完的部分copy到result尾部。
}
运行图示: