⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_algo.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 5 页
字号:
	else	  {	    std::iter_swap(__first, __last);	    ++__first;	  }    }  /**   *  @if maint   *  This is an uglified reverse(_BidirectionalIterator,   *                              _BidirectionalIterator)   *  overloaded for random access iterators.   *  @endif  */  template<typename _RandomAccessIterator>    void    __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,	      random_access_iterator_tag)    {      if (__first == __last)	return;      --__last;      while (__first < __last)	{	  std::iter_swap(__first, __last);	  ++__first;	  --__last;	}    }  /**   *  @brief Reverse a sequence.   *  @param  first  A bidirectional iterator.   *  @param  last   A bidirectional iterator.   *  @return   reverse() returns no value.   *   *  Reverses the order of the elements in the range @p [first,last),   *  so that the first element becomes the last etc.   *  For every @c i such that @p 0<=i<=(last-first)/2), @p reverse()   *  swaps @p *(first+i) and @p *(last-(i+1))  */  template<typename _BidirectionalIterator>    inline void    reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)    {      // concept requirements      __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<				  _BidirectionalIterator>)      __glibcxx_requires_valid_range(__first, __last);      std::__reverse(__first, __last, std::__iterator_category(__first));    }  /**   *  @brief Copy a sequence, reversing its elements.   *  @param  first   A bidirectional iterator.   *  @param  last    A bidirectional iterator.   *  @param  result  An output iterator.   *  @return  An iterator designating the end of the resulting sequence.   *   *  Copies the elements in the range @p [first,last) to the range   *  @p [result,result+(last-first)) such that the order of the   *  elements is reversed.   *  For every @c i such that @p 0<=i<=(last-first), @p reverse_copy()   *  performs the assignment @p *(result+(last-first)-i) = *(first+i).   *  The ranges @p [first,last) and @p [result,result+(last-first))   *  must not overlap.  */  template<typename _BidirectionalIterator, typename _OutputIterator>    _OutputIterator    reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,			     _OutputIterator __result)    {      // concept requirements      __glibcxx_function_requires(_BidirectionalIteratorConcept<				  _BidirectionalIterator>)      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,		typename iterator_traits<_BidirectionalIterator>::value_type>)      __glibcxx_requires_valid_range(__first, __last);      while (__first != __last)	{	  --__last;	  *__result = *__last;	  ++__result;	}      return __result;    }  /**   *  @if maint   *  This is a helper function for the rotate algorithm specialized on RAIs.   *  It returns the greatest common divisor of two integer values.   *  @endif  */  template<typename _EuclideanRingElement>    _EuclideanRingElement    __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)    {      while (__n != 0)	{	  _EuclideanRingElement __t = __m % __n;	  __m = __n;	  __n = __t;	}      return __m;    }  /**   *  @if maint   *  This is a helper function for the rotate algorithm.   *  @endif  */  template<typename _ForwardIterator>    void    __rotate(_ForwardIterator __first,	     _ForwardIterator __middle,	     _ForwardIterator __last,	     forward_iterator_tag)    {      if (__first == __middle || __last  == __middle)	return;      _ForwardIterator __first2 = __middle;      do	{	  swap(*__first, *__first2);	  ++__first;	  ++__first2;	  if (__first == __middle)	    __middle = __first2;	}      while (__first2 != __last);      __first2 = __middle;      while (__first2 != __last)	{	  swap(*__first, *__first2);	  ++__first;	  ++__first2;	  if (__first == __middle)	    __middle = __first2;	  else if (__first2 == __last)	    __first2 = __middle;	}    }  /**   *  @if maint   *  This is a helper function for the rotate algorithm.   *  @endif  */  template<typename _BidirectionalIterator>    void    __rotate(_BidirectionalIterator __first,	     _BidirectionalIterator __middle,	     _BidirectionalIterator __last,	      bidirectional_iterator_tag)    {      // concept requirements      __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<				  _BidirectionalIterator>)      if (__first == __middle || __last  == __middle)	return;      std::__reverse(__first,  __middle, bidirectional_iterator_tag());      std::__reverse(__middle, __last,   bidirectional_iterator_tag());      while (__first != __middle && __middle != __last)	{	  swap(*__first, *--__last);	  ++__first;	}      if (__first == __middle)	std::__reverse(__middle, __last,   bidirectional_iterator_tag());      else	std::__reverse(__first,  __middle, bidirectional_iterator_tag());    }  /**   *  @if maint   *  This is a helper function for the rotate algorithm.   *  @endif  */  template<typename _RandomAccessIterator>    void    __rotate(_RandomAccessIterator __first,	     _RandomAccessIterator __middle,	     _RandomAccessIterator __last,	     random_access_iterator_tag)    {      // concept requirements      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<				  _RandomAccessIterator>)      if (__first == __middle || __last  == __middle)	return;      typedef typename iterator_traits<_RandomAccessIterator>::difference_type	_Distance;      typedef typename iterator_traits<_RandomAccessIterator>::value_type	_ValueType;      const _Distance __n = __last   - __first;      const _Distance __k = __middle - __first;      const _Distance __l = __n - __k;      if (__k == __l)	{	  std::swap_ranges(__first, __middle, __middle);	  return;	}      const _Distance __d = __gcd(__n, __k);      for (_Distance __i = 0; __i < __d; __i++)	{	  _ValueType __tmp = *__first;	  _RandomAccessIterator __p = __first;	  if (__k < __l)	    {	      for (_Distance __j = 0; __j < __l / __d; __j++)		{		  if (__p > __first + __l)		    {		      *__p = *(__p - __l);		      __p -= __l;		    }		  *__p = *(__p + __k);		  __p += __k;		}	    }	  else	    {	      for (_Distance __j = 0; __j < __k / __d - 1; __j ++)		{		  if (__p < __last - __k)		    {		      *__p = *(__p + __k);		      __p += __k;		    }		  *__p = * (__p - __l);		  __p -= __l;		}	    }	  *__p = __tmp;	  ++__first;	}    }  /**   *  @brief Rotate the elements of a sequence.   *  @param  first   A forward iterator.   *  @param  middle  A forward iterator.   *  @param  last    A forward iterator.   *  @return  Nothing.   *   *  Rotates the elements of the range @p [first,last) by @p (middle-first)   *  positions so that the element at @p middle is moved to @p first, the   *  element at @p middle+1 is moved to @first+1 and so on for each element   *  in the range @p [first,last).   *   *  This effectively swaps the ranges @p [first,middle) and   *  @p [middle,last).   *   *  Performs @p *(first+(n+(last-middle))%(last-first))=*(first+n) for   *  each @p n in the range @p [0,last-first).  */  template<typename _ForwardIterator>    inline void    rotate(_ForwardIterator __first, _ForwardIterator __middle,	   _ForwardIterator __last)    {      // concept requirements      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<				  _ForwardIterator>)      __glibcxx_requires_valid_range(__first, __middle);      __glibcxx_requires_valid_range(__middle, __last);      typedef typename iterator_traits<_ForwardIterator>::iterator_category	_IterType;      std::__rotate(__first, __middle, __last, _IterType());    }  /**   *  @brief Copy a sequence, rotating its elements.   *  @param  first   A forward iterator.   *  @param  middle  A forward iterator.   *  @param  last    A forward iterator.   *  @param  result  An output iterator.   *  @return   An iterator designating the end of the resulting sequence.   *   *  Copies the elements of the range @p [first,last) to the range   *  beginning at @result, rotating the copied elements by @p (middle-first)   *  positions so that the element at @p middle is moved to @p result, the   *  element at @p middle+1 is moved to @result+1 and so on for each element   *  in the range @p [first,last).   *   *  Performs @p *(result+(n+(last-middle))%(last-first))=*(first+n) for   *  each @p n in the range @p [0,last-first).  */  template<typename _ForwardIterator, typename _OutputIterator>    _OutputIterator    rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,                _ForwardIterator __last, _OutputIterator __result)    {      // concept requirements      __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,		typename iterator_traits<_ForwardIterator>::value_type>)      __glibcxx_requires_valid_range(__first, __middle);      __glibcxx_requires_valid_range(__middle, __last);      return std::copy(__first, __middle,                       std::copy(__middle, __last, __result));    }  /**   *  @brief Randomly shuffle the elements of a sequence.   *  @param  first   A forward iterator.   *  @param  last    A forward iterator.   *  @return  Nothing.   *   *  Reorder the elements in the range @p [first,last) using a random   *  distribution, so that every possible ordering of the sequence is   *  equally likely.  */  template<typename _RandomAccessIterator>    inline void    random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)    {      // concept requirements      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<	    _RandomAccessIterator>)      __glibcxx_requires_valid_range(__first, __last);      if (__first != __last)	for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)	  std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));    }  /**   *  @brief Shuffle the elements of a sequence using a random number   *         generator.   *  @param  first   A forward iterator.   *  @param  last    A forward iterator.   *  @param  rand    The RNG functor or function.   *  @return  Nothing.   *   *  Reorders the elements in the range @p [first,last) using @p rand to   *  provide a random distribution. Calling @p rand(N) for a positive   *  integer @p N should return a randomly chosen integer from the   *  range [0,N).  */  template<typename _RandomAccessIterator, typename _RandomNumberGenerator>    void    random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,		   _RandomNumberGenerator& __rand)    {      // concept requirements      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<	    _RandomAccessIterator>)      __glibcxx_requires_valid_range(__first, __last);      if (__first == __last)	return;      for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)	std::iter_swap(__i, __first + __rand((__i - __first) + 1));    }  /**   *  @if maint   *  This is a helper function...   *  @endif  */  template<typename _ForwardIterator, typename _Predicate>    _ForwardIterator    __partition(_ForwardIterator __first, _ForwardIterator __last,		_Predicate __pred,		forward_iterator_tag)    {      if (

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -