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

📄 stl_algobase.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 3 页
字号:
    inline _OI    __copy_aux(_II __first, _II __last, _OI __result)    {      typedef typename iterator_traits<_II>::value_type _ValueTypeI;      typedef typename iterator_traits<_OI>::value_type _ValueTypeO;      typedef typename iterator_traits<_II>::iterator_category _Category;      const bool __simple = (__is_scalar<_ValueTypeI>::__value	                     && __is_pointer<_II>::__value	                     && __is_pointer<_OI>::__value			     && __are_same<_ValueTypeI, _ValueTypeO>::__value);      return std::__copy<__simple, _Category>::copy(__first, __last, __result);    }  template<bool, bool>    struct __copy_normal    {      template<typename _II, typename _OI>        static _OI        copy_n(_II __first, _II __last, _OI __result)        { return std::__copy_aux(__first, __last, __result); }    };  template<>    struct __copy_normal<true, false>    {      template<typename _II, typename _OI>        static _OI        copy_n(_II __first, _II __last, _OI __result)        { return std::__copy_aux(__first.base(), __last.base(), __result); }    };  template<>    struct __copy_normal<false, true>    {      template<typename _II, typename _OI>        static _OI        copy_n(_II __first, _II __last, _OI __result)        { return _OI(std::__copy_aux(__first, __last, __result.base())); }    };  template<>    struct __copy_normal<true, true>    {      template<typename _II, typename _OI>        static _OI        copy_n(_II __first, _II __last, _OI __result)        { return _OI(std::__copy_aux(__first.base(), __last.base(),				     __result.base())); }    };  /**   *  @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)   *   *  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).  Result may not be contained within   *  [first,last); the copy_backward function should be used instead.   *   *  Note that the end of the output range is permitted to be contained   *  within [first,last).  */  template<typename _InputIterator, typename _OutputIterator>    inline _OutputIterator    copy(_InputIterator __first, _InputIterator __last,	 _OutputIterator __result)    {      // concept requirements      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,	    typename iterator_traits<_InputIterator>::value_type>)      __glibcxx_requires_valid_range(__first, __last);       const bool __in = __is_normal_iterator<_InputIterator>::__value;       const bool __out = __is_normal_iterator<_OutputIterator>::__value;       return std::__copy_normal<__in, __out>::copy_n(__first, __last,						      __result);    }    template<bool, typename>    struct __copy_backward    {      template<typename _BI1, typename _BI2>        static _BI2        copy_b(_BI1 __first, _BI1 __last, _BI2 __result)        { 	  while (__first != __last)	    *--__result = *--__last;	  return __result;	}    };  template<bool _BoolType>    struct __copy_backward<_BoolType, random_access_iterator_tag>    {      template<typename _BI1, typename _BI2>        static _BI2        copy_b(_BI1 __first, _BI1 __last, _BI2 __result)        { 	  typename iterator_traits<_BI1>::difference_type __n;	  for (__n = __last - __first; __n > 0; --__n)	    *--__result = *--__last;	  return __result;	}    };  template<>    struct __copy_backward<true, random_access_iterator_tag>    {      template<typename _Tp>        static _Tp*        copy_b(const _Tp* __first, const _Tp* __last, _Tp* __result)        { 	  const ptrdiff_t _Num = __last - __first;	  std::memmove(__result - _Num, __first, sizeof(_Tp) * _Num);	  return __result - _Num;	}    };  template<typename _BI1, typename _BI2>    inline _BI2    __copy_backward_aux(_BI1 __first, _BI1 __last, _BI2 __result)    {      typedef typename iterator_traits<_BI1>::value_type _ValueType1;      typedef typename iterator_traits<_BI2>::value_type _ValueType2;      typedef typename iterator_traits<_BI1>::iterator_category _Category;      const bool __simple = (__is_scalar<_ValueType1>::__value	                     && __is_pointer<_BI1>::__value	                     && __is_pointer<_BI2>::__value			     && __are_same<_ValueType1, _ValueType2>::__value);      return std::__copy_backward<__simple, _Category>::copy_b(__first, __last,							       __result);    }  template<bool, bool>    struct __copy_backward_normal    {      template<typename _BI1, typename _BI2>        static _BI2        copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)        { return std::__copy_backward_aux(__first, __last, __result); }    };  template<>    struct __copy_backward_normal<true, false>    {      template<typename _BI1, typename _BI2>        static _BI2        copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)        { return std::__copy_backward_aux(__first.base(), __last.base(),					  __result); }    };  template<>    struct __copy_backward_normal<false, true>    {      template<typename _BI1, typename _BI2>        static _BI2        copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)        { return _BI2(std::__copy_backward_aux(__first, __last,					       __result.base())); }    };  template<>    struct __copy_backward_normal<true, true>    {      template<typename _BI1, typename _BI2>        static _BI2        copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)        { return _BI2(std::__copy_backward_aux(__first.base(), __last.base(),					       __result.base())); }    };  /**   *  @brief Copies the range [first,last) into result.   *  @param  first  A bidirectional iterator.   *  @param  last   A bidirectional iterator.   *  @param  result A bidirectional 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).   *   *  Result may not be in the range [first,last).  Use copy instead.  Note   *  that the start of the output range may overlap [first,last).  */  template <typename _BI1, typename _BI2>    inline _BI2    copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)    {      // concept requirements      __glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)      __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)      __glibcxx_function_requires(_ConvertibleConcept<	    typename iterator_traits<_BI1>::value_type,	    typename iterator_traits<_BI2>::value_type>)      __glibcxx_requires_valid_range(__first, __last);      const bool __bi1 = __is_normal_iterator<_BI1>::__value;      const bool __bi2 = __is_normal_iterator<_BI2>::__value;      return std::__copy_backward_normal<__bi1, __bi2>::copy_b_n(__first, __last,								 __result);    }  template<bool>    struct __fill    {      template<typename _ForwardIterator, typename _Tp>        static void        fill(_ForwardIterator __first, _ForwardIterator __last,	     const _Tp& __value)        {	  for (; __first != __last; ++__first)	    *__first = __value;	}    };  template<>    struct __fill<true>    {      template<typename _ForwardIterator, typename _Tp>        static void        fill(_ForwardIterator __first, _ForwardIterator __last,	     const _Tp& __value)        {	  const _Tp __tmp = __value;	  for (; __first != __last; ++__first)	    *__first = __tmp;	}    };  /**   *  @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 _ForwardIterator, typename _Tp>    void    fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)    {      // concept requirements      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<				  _ForwardIterator>)      __glibcxx_requires_valid_range(__first, __last);      const bool __scalar = __is_scalar<_Tp>::__value;      std::__fill<__scalar>::fill(__first, __last, __value);    }  // Specialization: for one-byte types we can use memset.  inline void  fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)  {    __glibcxx_requires_valid_range(__first, __last);    const unsigned char __tmp = __c;    std::memset(__first, __tmp, __last - __first);  }  inline void  fill(signed char* __first, signed char* __last, const signed char& __c)  {    __glibcxx_requires_valid_range(__first, __last);    const signed char __tmp = __c;    std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);  }  inline void  fill(char* __first, char* __last, const char& __c)  {    __glibcxx_requires_valid_range(__first, __last);    const char __tmp = __c;    std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);  }  template<bool>    struct __fill_n    {      template<typename _OutputIterator, typename _Size, typename _Tp>        static _OutputIterator        fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)        {	  for (; __n > 0; --__n, ++__first)	    *__first = __value;	  return __first;	}    };  template<>    struct __fill_n<true>

⌨️ 快捷键说明

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