set相关操作源码

25 篇文章 0 订阅
/*
	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));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值