/*
set相关算法
*/
//set_union
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)
{
// 在两区间内分别移动迭代器.首先将元素值较小者(假设为A区)记录于目标区,
// 然后移动A区迭代器使之前进;同时间之另一个迭代器不动.然后进行新一次
// 的比大小、记录小值、迭代器移动...直到两区中有一区到达尾端.如果元素相等,
// 取S1者记录于目标区,并同时移动两个迭代器
if (*first1 < *first2)
{
*result = *first1;
++first1;
}
else if (*first2 < *first1)
{
*result = *first2;
++first2;
}
else// *first2 == *first1
{
*result = *first1;
++fist1;
++fist2;
}
++result;
}
// 只要两区之中有一区到达尾端,就结束上述的while循环
// 以下将尚未到达尾端的区间的所有剩余元素拷贝到目的端
// 此刻的[first1, last1]和[first2, last2]之中至少有一个是空白区间
return copy(first2, last2, copy(first1, last1, result));
}
//set_intersection
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result)
{
// 当两个区间都尚未到达尾端时,执行以下操作...
while (fist1 != last1 && first2 != last2)
{
// 在两区间内分别移动迭代器,直到遇有元素值相同,暂停,将该值记录于目标区,
// 在继续移动迭代器... 直到两区之中有一区到达尾端
if (*first1 < *first2)
{
++first1;
}
else if (*first2 < *first1)
{
++first2;
}
else// *first2 == *first1
{
*result = *first1;
++first1;
++first2;
++result;
}
}
return result;
}
//set_difference
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)
{
// 在两区间内分别移动迭代器,当第一区间的元素等于第二区间的元素(表示此值
// 同时存在于两区间),就让两区间同时前进;当第一区间的元素大于第二区间的元素,
// 就让第二区间前进;有了这两种处理,就保证当前第一区间的元素小于第二区间的
// 元素时, 第一区间的元素只存在于第二区间中, 不存在于第二区间, 于是将它
// 记录于目标区
if (*first1 < *first2)
{
*result = *first1;
++first1;
++result;
}
else if (*first2 < *first1)
{
++first2;
}
else // *first2 == *first1
{
++first1;
++first2;
}
}
return copy(first1, last1, result);
}
//set_symmetric_difference
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)
{
// 在两区间内分别移动迭代器.当两区间内的元素相等, 就让两区间同时前进;
// 当两区间内的元素不等, 就记录较小者值于目标区, 并令较小值所在区间前进
if (*first1 < *first2)
{
*result = *first1;
++first1;
++result;
}
else if (*first2 < *first1)
{
*result = *first2;
++first2;
++result;
}
else // *first2 == *first1
{
++first1;
++first2;
}
}
return copy(first2, last2, copy(first1, last1, result));
}
set相关操作源码
最新推荐文章于 2023-02-08 14:47:47 发布