STL复习之算法一

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尾部。
    }

运行图示:

猜你喜欢

转载自blog.csdn.net/weixin_40825228/article/details/81052355