在
就按这个文件从上往下来看,先看uninitialized_copy:
对于char * 和wchar *直接使用的是memmove来进行复制的,而对于其余结构,调用的是__uninitialized_copy函数。再看看它的结构:
可以看到它同样使用了type traits编程方法。如果类型是POD的,那么OK,直接copy就行了,否则就需要逐个调用拷贝构造函数为它们构造对象。调用的就是 _Construct(&*__cur, *__first); 这个东西在stl_construct.h里己经讨论过了。
再看看 uninitialized_fill
它调用的是inline void __uninitialized_fill,看看它们的结构:
可以看到也是用的type traits编程技术。对于POD(plain old data : C++11对其定义进行了放宽)类型来说,用是的 fill(__first, __last, __x);来进行填充,而对于非POD类型,则与copy一样,用的是_construct构造。
uninitialized_copy和uninitialized_fill实现非常相似,作用也相似,唯一的区别就是copy是将原始对象一个一个复制过来,而fill则是将每一个块内存都是同一个对象进行构造。
而对于uninitialized_copy_n与uninitialized_fill_n与uninitialized_copy和uninitialized_fill有许多相似之外,这里不再表述。
下一次再看看auto_ptr的实现,auto_ptr在《STL源码剖析》里面好像没有讲到(至少我看目录没有找到)。
- template <class _InputIter, class _ForwardIter>
- inline _ForwardIter
- uninitialized_copy(_InputIter __first, _InputIter __last,
- _ForwardIter __result)
- {
- return __uninitialized_copy(__first, __last, __result,
- __VALUE_TYPE(__result));
- }
- inline char* uninitialized_copy(const char* __first, const char* __last,
- char* __result) {
- memmove(__result, __first, __last - __first);
- return __result + (__last - __first);
- }
- inline wchar_t*
- uninitialized_copy(const wchar_t* __first, const wchar_t* __last,
- wchar_t* __result)
- {
- memmove(__result, __first, sizeof(wchar_t) * (__last - __first));
- return __result + (__last - __first);
- }
- // Valid if copy construction is equivalent to assignment, and if the
- // destructor is trivial.
- template <class _InputIter, class _ForwardIter>
- inline _ForwardIter
- __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
- _ForwardIter __result,
- __true_type)
- {
- return copy(__first, __last, __result);
- }
- template <class _InputIter, class _ForwardIter>
- _ForwardIter
- __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
- _ForwardIter __result,
- __false_type)
- {
- _ForwardIter __cur = __result;
- __STL_TRY {
- for ( ; __first != __last; ++__first, ++__cur)
- _Construct(&*__cur, *__first);
- return __cur;
- }
- __STL_UNWIND(_Destroy(__result, __cur));
- }
- template <class _InputIter, class _ForwardIter, class _Tp>
- inline _ForwardIter
- __uninitialized_copy(_InputIter __first, _InputIter __last,
- _ForwardIter __result, _Tp*)
- {
- typedef typename __type_traits<_Tp>::is_POD_type _Is_POD;
- return __uninitialized_copy_aux(__first, __last, __result, _Is_POD());
- }
再看看 uninitialized_fill
- template <class _ForwardIter, class _Tp>
- inline void uninitialized_fill(_ForwardIter __first,
- _ForwardIter __last,
- const _Tp& __x)
- {
- __uninitialized_fill(__first, __last, __x, __VALUE_TYPE(__first));
- }
- template <class _ForwardIter, class _Tp>
- inline void
- __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __x, __true_type)
- {
- fill(__first, __last, __x);
- }
- template <class _ForwardIter, class _Tp>
- void
- __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __x, __false_type)
- {
- _ForwardIter __cur = __first;
- __STL_TRY {
- for ( ; __cur != __last; ++__cur)
- _Construct(&*__cur, __x);
- }
- __STL_UNWIND(_Destroy(__first, __cur));
- }
- template <class _ForwardIter, class _Tp, class _Tp1>
- inline void __uninitialized_fill(_ForwardIter __first,
- _ForwardIter __last, const _Tp& __x, _Tp1*)
- {
- typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD;
- __uninitialized_fill_aux(__first, __last, __x, _Is_POD());
-
- }
uninitialized_copy和uninitialized_fill实现非常相似,作用也相似,唯一的区别就是copy是将原始对象一个一个复制过来,而fill则是将每一个块内存都是同一个对象进行构造。
而对于uninitialized_copy_n与uninitialized_fill_n与uninitialized_copy和uninitialized_fill有许多相似之外,这里不再表述。
下一次再看看auto_ptr的实现,auto_ptr在《STL源码剖析》里面好像没有讲到(至少我看目录没有找到)。