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

📄 stl_algobase.h

📁 俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)的全部源代码。
💻 H
📖 第 1 页 / 共 2 页
字号:
    {      static _Tp*      copy(const _Tp* __first, const _Tp* __last, _Tp* __result)      {	return  __copy_backward_dispatch<_Tp*, _Tp*, __true_type>	  ::copy(__first, __last, __result);      }    };  template<typename _BI1, typename _BI2>    inline _BI2    __copy_backward_aux(_BI1 __first, _BI1 __last, _BI2 __result)    {      typedef typename __type_traits<typename iterator_traits<_BI2>::value_type>			    ::has_trivial_assignment_operator _Trivial;      return __copy_backward_dispatch<_BI1, _BI2, _Trivial>		  ::copy(__first, __last, __result);    }  template <typename _BI1, typename _BI2>    inline _BI2    __copy_backward_output_normal_iterator(_BI1 __first, _BI1 __last,					   _BI2 __result, __true_type)    { return _BI2(__copy_backward_aux(__first, __last, __result.base())); }  template <typename _BI1, typename _BI2>    inline _BI2    __copy_backward_output_normal_iterator(_BI1 __first, _BI1 __last,					   _BI2 __result, __false_type)    { return __copy_backward_aux(__first, __last, __result); }  template <typename _BI1, typename _BI2>    inline _BI2    __copy_backward_input_normal_iterator(_BI1 __first, _BI1 __last,					  _BI2 __result, __true_type)    {      typedef typename _Is_normal_iterator<_BI2>::_Normal __Normal;      return __copy_backward_output_normal_iterator(__first.base(), __last.base(),						    __result, __Normal());    }  template <typename _BI1, typename _BI2>    inline _BI2    __copy_backward_input_normal_iterator(_BI1 __first, _BI1 __last,					  _BI2 __result, __false_type)    {      typedef typename _Is_normal_iterator<_BI2>::_Normal __Normal;      return __copy_backward_output_normal_iterator(__first, __last, __result,						    __Normal());    }  /**   *  @brief Copies the range [first,last) into result.   *  @param  first  An input iterator.   *  @param  last   An input iterator.   *  @param  result An output iterator.   *  @return   result - (first - last)   *   *  The function has the same effect as copy, but starts at the end of the   *  range and works its way to the start, returning the start of the result.   *  This inline function will boil down to a call to @c memmove whenever   *  possible.  Failing that, if random access iterators are passed, then the   *  loop count will be known (and therefore a candidate for compiler   *  optimizations such as unrolling).  */  template <typename _BI1, typename _BI2>    inline _BI2    copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)    {      // concept requirements      __glibcpp_function_requires(_BidirectionalIteratorConcept<_BI1>)      __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)      __glibcpp_function_requires(_ConvertibleConcept<	    typename iterator_traits<_BI1>::value_type,	    typename iterator_traits<_BI2>::value_type>)      typedef typename _Is_normal_iterator<_BI1>::_Normal __Normal;      return __copy_backward_input_normal_iterator(__first, __last, __result,						   __Normal());    }  //--------------------------------------------------  // fill and fill_n  /**   *  @brief Fills the range [first,last) with copies of value.   *  @param  first  A forward iterator.   *  @param  last   A forward iterator.   *  @param  value  A reference-to-const of arbitrary type.   *  @return   Nothing.   *   *  This function fills a range with copies of the same value.  For one-byte   *  types filling contiguous areas of memory, this becomes an inline call to   *  @c memset.  */  template<typename _ForwardIter, typename _Tp>    void    fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)    {      // concept requirements      __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)      for ( ; __first != __last; ++__first)	*__first = __value;    }  /**   *  @brief Fills the range [first,first+n) with copies of value.   *  @param  first  An output iterator.   *  @param  n      The count of copies to perform.   *  @param  value  A reference-to-const of arbitrary type.   *  @return   The iterator at first+n.   *   *  This function fills a range with copies of the same value.  For one-byte   *  types filling contiguous areas of memory, this becomes an inline call to   *  @c memset.  */  template<typename _OutputIter, typename _Size, typename _Tp>    _OutputIter    fill_n(_OutputIter __first, _Size __n, const _Tp& __value)    {      // concept requirements      __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,_Tp>)      for ( ; __n > 0; --__n, ++__first)	*__first = __value;      return __first;    }  // Specialization: for one-byte types we can use memset.  inline void  fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)  {    unsigned char __tmp = __c;    memset(__first, __tmp, __last - __first);  }  inline void  fill(signed char* __first, signed char* __last, const signed char& __c)  {    signed char __tmp = __c;    memset(__first, static_cast<unsigned char>(__tmp), __last - __first);  }  inline void  fill(char* __first, char* __last, const char& __c)  {    char __tmp = __c;    memset(__first, static_cast<unsigned char>(__tmp), __last - __first);  }  template<typename _Size>    inline unsigned char*    fill_n(unsigned char* __first, _Size __n, const unsigned char& __c)    {      fill(__first, __first + __n, __c);      return __first + __n;    }  template<typename _Size>    inline signed char*    fill_n(char* __first, _Size __n, const signed char& __c)    {      fill(__first, __first + __n, __c);      return __first + __n;    }  template<typename _Size>    inline char*    fill_n(char* __first, _Size __n, const char& __c)    {      fill(__first, __first + __n, __c);      return __first + __n;    }  //--------------------------------------------------  // equal and mismatch  /**   *  @brief Finds the places in ranges which don't match.   *  @param  first1  An input iterator.   *  @param  last1   An input iterator.   *  @param  first2  An input iterator.   *  @return   A pair of iterators pointing to the first mismatch.   *   *  This compares the elements of two ranges using @c == and returns a pair   *  of iterators.  The first iterator points into the first range, the   *  second iterator points into the second range, and the elements pointed   *  to by the iterators are not equal.  */  template<typename _InputIter1, typename _InputIter2>    pair<_InputIter1, _InputIter2>    mismatch(_InputIter1 __first1, _InputIter1 __last1,	     _InputIter2 __first2)    {      // concept requirements      __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)      __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)      __glibcpp_function_requires(_EqualityComparableConcept<	    typename iterator_traits<_InputIter1>::value_type>)      __glibcpp_function_requires(_EqualityComparableConcept<	    typename iterator_traits<_InputIter2>::value_type>)      while (__first1 != __last1 && *__first1 == *__first2) {	++__first1;	++__first2;      }      return pair<_InputIter1, _InputIter2>(__first1, __first2);    }  /**   *  @brief Finds the places in ranges which don't match.   *  @param  first1  An input iterator.   *  @param  last1   An input iterator.   *  @param  first2  An input iterator.   *  @param  binary_pred  A binary predicate @link s20_3_1_base functor@endlink.   *  @return   A pair of iterators pointing to the first mismatch.   *   *  This compares the elements of two ranges using the binary_pred   *  parameter, and returns a pair   *  of iterators.  The first iterator points into the first range, the   *  second iterator points into the second range, and the elements pointed   *  to by the iterators are not equal.  */  template<typename _InputIter1, typename _InputIter2, typename _BinaryPredicate>    pair<_InputIter1, _InputIter2>    mismatch(_InputIter1 __first1, _InputIter1 __last1,	     _InputIter2 __first2,	     _BinaryPredicate __binary_pred)    {      // concept requirements      __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)      __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)      while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {	++__first1;	++__first2;      }      return pair<_InputIter1, _InputIter2>(__first1, __first2);    }  /**   *  @brief Tests a range for element-wise equality.   *  @param  first1  An input iterator.   *  @param  last1   An input iterator.   *  @param  first2  An input iterator.   *  @return   A boolean true or false.   *   *  This compares the elements of two ranges using @c == and returns true or   *  false depending on whether all of the corresponding elements of the   *  ranges are equal.  */  template<typename _InputIter1, typename _InputIter2>    inline bool    equal(_InputIter1 __first1, _InputIter1 __last1,	  _InputIter2 __first2)    {      // concept requirements      __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)      __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)      __glibcpp_function_requires(_EqualOpConcept<	    typename iterator_traits<_InputIter1>::value_type,	    typename iterator_traits<_InputIter2>::value_type>)      for ( ; __first1 != __last1; ++__first1, ++__first2)	if (!(*__first1 == *__first2))	  return false;      return true;    }  /**   *  @brief Tests a range for element-wise equality.   *  @param  first1  An input iterator.   *  @param  last1   An input iterator.   *  @param  first2  An input iterator.   *  @param  binary_pred  A binary predicate @link s20_3_1_base functor@endlink.   *  @return   A boolean true or false.   *   *  This compares the elements of two ranges using the binary_pred   *  parameter, and returns true or   *  false depending on whether all of the corresponding elements of the   *  ranges are equal.  */  template<typename _InputIter1, typename _InputIter2, typename _BinaryPredicate>    inline bool    equal(_InputIter1 __first1, _InputIter1 __last1,	  _InputIter2 __first2,	  _BinaryPredicate __binary_pred)    {      // concept requirements      __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)      __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)      for ( ; __first1 != __last1; ++__first1, ++__first2)	if (!__binary_pred(*__first1, *__first2))	  return false;      return true;    }  //--------------------------------------------------  // lexicographical_compare  /**   *  @brief Performs "dictionary" comparison on ranges.   *  @param  first1  An input iterator.   *  @param  last1   An input iterator.   *  @param  first2  An input iterator.   *  @param  last2   An input iterator.   *  @return   A boolean true or false.   *   *  "Returns true if the sequence of elements defined by the range   *  [first1,last1) is lexicographically less than the sequence of elements   *  defined by the range [first2,last2).  Returns false otherwise."   *  (Quoted from [25.3.8]/1.)  If the iterators are all character pointers,   *  then this is an inline call to @c memcmp.  */  template<typename _InputIter1, typename _InputIter2>    bool    lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,			    _InputIter2 __first2, _InputIter2 __last2)    {      // concept requirements      __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)      __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)      __glibcpp_function_requires(_LessThanComparableConcept<	    typename iterator_traits<_InputIter1>::value_type>)      __glibcpp_function_requires(_LessThanComparableConcept<	    typename iterator_traits<_InputIter2>::value_type>)      for ( ; __first1 != __last1 && __first2 != __last2	    ; ++__first1, ++__first2) {	if (*__first1 < *__first2)	  return true;	if (*__first2 < *__first1)	  return false;      }      return __first1 == __last1 && __first2 != __last2;    }  /**   *  @brief Performs "dictionary" comparison on ranges.   *  @param  first1  An input iterator.   *  @param  last1   An input iterator.   *  @param  first2  An input iterator.   *  @param  last2   An input iterator.   *  @param  comp  A @link s20_3_3_comparisons comparison functor@endlink.   *  @return   A boolean true or false.   *   *  The same as the four-parameter @c lexigraphical_compare, but uses the   *  comp parameter instead of @c <.  */  template<typename _InputIter1, typename _InputIter2, typename _Compare>    bool    lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,			    _InputIter2 __first2, _InputIter2 __last2,			    _Compare __comp)    {      // concept requirements      __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)      __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)      for ( ; __first1 != __last1 && __first2 != __last2	    ; ++__first1, ++__first2) {	if (__comp(*__first1, *__first2))	  return true;	if (__comp(*__first2, *__first1))	  return false;      }      return __first1 == __last1 && __first2 != __last2;    }  inline bool   lexicographical_compare(const unsigned char* __first1, const unsigned char* __last1,			  const unsigned char* __first2, const unsigned char* __last2)  {    const size_t __len1 = __last1 - __first1;    const size_t __len2 = __last2 - __first2;    const int __result = memcmp(__first1, __first2, min(__len1, __len2));    return __result != 0 ? __result < 0 : __len1 < __len2;  }  inline bool  lexicographical_compare(const char* __first1, const char* __last1,			  const char* __first2, const char* __last2)  {#if CHAR_MAX == SCHAR_MAX    return lexicographical_compare((const signed char*) __first1,				   (const signed char*) __last1,				   (const signed char*) __first2,				   (const signed char*) __last2);#else /* CHAR_MAX == SCHAR_MAX */    return lexicographical_compare((const unsigned char*) __first1,				   (const unsigned char*) __last1,				   (const unsigned char*) __first2,				   (const unsigned char*) __last2);#endif /* CHAR_MAX == SCHAR_MAX */  }} // namespace std#endif /* __GLIBCPP_INTERNAL_ALGOBASE_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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