首页 > 代码库 > 自己动手实现STL 03:内存基本处理工具(stl_uninitialized.h)

自己动手实现STL 03:内存基本处理工具(stl_uninitialized.h)

一、前言

  前面两篇已经编写了内存配置器和建构解构工具函数。这里,就准备编写并介绍下内存基本处理工具函数。比如uninitialized_copy()、uninitialized_copy和 uninitialized_copy_n()等的实现。

二、内存工具函数简介

1.uninitialized_copy函数

  uninitialized_copy()使我们能够将内存的配置与对象的建构行为分离开来。如果作为输出目的地的[result, result+(last-first))范围内的每一个迭代器都指向未初始化区域,则uninitialized_copy()会使用copy construct,为身为输入来源[first, last)范围内的每一个对象产生一份复制品,放进输出范围中。

  如果你需要初始化一个容器的话,这个函数可以其很大最用。通过用两步完成:配置内存区块;然后使用uninitizlied_copy,在该内存区块上建构元素。

  c++标准还规定uninitialized_copy()具有"commit or rollback"语意。即,要么建构出所有元素,要么不建构任何东西,不能存在半建构状态。

  下面是uninitialized_copy函数调用结构图:

图1:uninitialized_copy函数体系

  uninitialized_copy()是一个模版函数:

 1 // uninitialized_copy 的函数模板 2 // uninitialized_copy -> __uninitialized_copy 3 // 利用编译器的类型推导,萃取处迭代器指向的类型 4 // 以便最后通过类型萃取__type_traits机制获取迭代器指向类型的一些属性 5 template <class InputIterator, class ForwardIterator> 6 inline ForwardIterator 7 uninitialized_copy(InputIterator first, InputIterator last, 8         ForwardIterator result) 9 {10     // value_type是个模板函数,萃取迭代器指向类型,用该类型生成临时对象,11     // 再利用类型推导12     return __uninitialized_copy(first, last, result, value_type(result));13 14 }

  在uninitialized_copy()内调用了一个内部的实现函数__uninitialized_copy(),这个调用的目的就是为了利用编译器的类型推导功能,获取迭代器的指向对象的类型。下面是内部调用的__unintialized_copy()函数:

 1 // __uninitialized_copy-->__uninitilaized_copy_aux 2 // 是为利用编译器的类型参数推导,判断是否是POD类型 3 template <class InputIterator, class ForwardIterator, class T> 4 inline ForwardIterator 5 __uninitialized_copy(InputItearator first, InputIeratorlast, 6         ForwardIterator result, T*) 7 { 8     // is_POD 是一种类型,或者是__true_type代表为真,__ 9     // false_type代表为否,假10     // 利用is_POD的不同定义,生成不同的临时对象,用其进行重载11     typedef typename __type_traits<T>::is_POD_type  is_POD;12     return __uninitialized_copy_aux(first, last, result, is_POD());13 }

  在__uninitialized_copy()内部又利用了类型属性萃取类型萃取了迭代器指向对象类型是否是POD,并利用is_POD生成对象用于重载。对于__uninitialized_copy_aux(),源码如下:

a. is_POD定义为__true_type

// 如果是POD型别,那么copy construction 等同于 assignment,而且// destruction 是trivial,以下就有效// 执行流程就会转进到以下函数。// POD  意指Plain Old Data,指标量型别或者是传统的C Struct型别// POD型别必须拥有trivial ctor/dtor/copy/assignment函数// 这是藉由function template的参数推导机制而得template <class InputIterator, class ForwardIterator>inline ForwardIterator__uninitialized_copy_aux(InputIterator first, InputIterator last,                        ForwardIterator result,                        __true_type){    //这里的_true_type 代表迭代器指向的类型是POD型别,不用构造,可以    //直接拷贝    return copy(first, last, result);}

b.is_POD定义为__false_type

  不是POD类型,那么对于每一个元素,都需要调用其copy construct函数进行构造

 1 template <class InputIterator, class ForwardIterator> 2 ForwardIerator 3 __uninitialized_copy_aux(InputIterator first, InputIterator last, 4                         ForwardIterator result, 5                         __false_type) 6 { 7     //这里的_false_type 代表迭代器指向的类型非POD型别, 8     //不能直接拷贝,需要一个一个的调用其构造函数 9     ForwardIterator cur = result;10     __STL_TRY11     {12         for (; first != last; ++first, ++cur)13             construct(&*cur, *first);14         return cur;15     }16     //commit or rollback17     __STL_UNWIND(destroy(result, cur));18 }

c.针对char*和wchar_t* 的特化版本

  对于char*类型的迭代器,其迭代器指向的对象类型是char,对于char利用内存底层的memmove()复制速度更快。所以针对char*编写出其的特化版本。上述理由对于wchar_t*也是成立。源码如下:

1 // uninitialized_copy 对于char* 的特化版本2 inline char* uninitialized_cpoy(const char* first, const char* last,3         char* result)4 {5     //对于char *对其使用memmove效率最高6     memmove(result, first, last - first);7     return result + (last - first);8 }
1 // unitialized_copy 对于 wchar_t* 的特化版本2 inline wchar_t* uninitialized_copy(const wchar_t* first,3         const wchar_t* last, wchar_t* result)4 {5     //同样对于wchar_t *对其使用memmove效率最高6     memmove(result, first, sizeof(wchar_t) * (last - first));7     return result + (last - first);8 }

 

2.uninitialized_copy_n函数

  该函数调用接口为uninitialized_copy_n(InputIterator first, Size count,ForwardIterator result),这个函数接受一个输入迭代器,和输出迭代器,以及要复制的个数。

  函数对外的接口实现:

 1 template <class InputIterator, class Size, class ForwardIterator> 2 inline pair<InputIterator, ForwardIterator> 3 uninitialized_copy_n(InputIterator first, Size count, 4         ForwardIterator result) 5 { 6     // 利用模板函数iterator_category提取出first迭代器的分类型别 7     // 然后利用其型别进行重载,对于不同的型别进行不同的优化处理 8     return __uninitialized_copy_n(first, count, result, 9             iterator_category(first));10 }

  利用迭代器的分类类型产生临时对象,并利用其进行重载,对不同的分类类型进行不同的适当处理.

a.迭代器分类为random_ierator_tag

 1 template <class RandomAccessItearator, class Size, class ForwardIterator> 2 inline pair<RandomAccessIterator, ForwardIterator> 3 __uninitialized_copy_n(RandomAccessIterator first, Size count, 4         ForwardIterator result, random_ierator_tag) 5 { 6     // 对于random_iterator_tag类型的迭代器 7     // 可以利用first和count计算出last迭代器 8     // 然后利用uninitialized_copy(first, last, result) 9     // 然而对于input_iterator_tag,就不能10     RandomAccessIterator last = first _count;11     return make_pair(last, uninitialized_copy(first, last, result));12 }

b.迭代器分类为输入迭代器,前向迭代器和双向迭代器时

  由于迭代器的分类标签类型的继承关系,

1 //五个作为标记用的型别(tag types)2 struct input_iterator_tag { };3 struct forward_iterator_tag : public input_iterator_tag { };4 struct bidirectional_iterator_tag : public forward_iterator_tag { };5 struct random_access_iterator_tag : public bidirectional_iterator_tag { };

后面三种迭代器类型,都会进行隐式类型转换,转换为input_ierator_tag。

 1 // input_iterator_tag 是迭代器的分类中的一种,利用迭代器分类类型的不同 2 // 可以进行重载,不同的迭代器的类型,会针对其有特定的最优实现 3 template <class InputItearator, class Size, class ForwardIterator> 4 pair<InputIterator, ForwardIterator> 5 __uninitialized_copy_n(InputIterator first, Size count, 6         ForwardIterator result, input_ierator_tag) 7 { 8     // 对于input_iterator_tag类型的迭代器,只能逐个调用构造 9     ForwardIterator cur = result;10     __STL_TRY11     {12         for (; count > 0; --count, ++first, ++cur)13             construct(&*cur, *first);14         return pair<InputIterator, ForwardIterator>(first, cur);15     }16     // commit or rollback17     __STL_UNWIND(destroy(result, cur));18 }

 

3.uninitialized_fill函数

  uninitialized_fill()也能够使我们将内存配置与对象的建构行为分离开。如果[first, last)范围内每个迭代器都指向未初始化的内存,那么uninitialized_fill()会在该范围内产生x的复制品。全部初始化为x。与uninitialized_copy()不同,uninitialized_copy()是以一段迭代器标记的区块内的元素去初始化自己的未初始化元素。这里是全部初始化为同一个指定的值x。下面是uninitialized_fill()函数的实现体系:

图2:uninitialized_fill()函数的实现体系

  下面,先是uninitialized_fill函数对外的接口的实现:

1 // uninitialized_fill()对外接口2 template <class ForwardIterator, class T>3 inline void uninitialized_fill(ForwardIterator first, ForwardIterator last,4         const T& x)5 {6     __uninitialized_fill(first, last, x, value_type(first));7 }

  在这里uninitialized_fill()----->__uninitialized_fill()的调用还是为了利用编译器的类型推导功能,获取迭代器指向对象的类型。

 1 // 内部的第二层,用于提取迭代器指向的类型是否是POD类型 2 // 并利用其进行重载 3 template <class ForwardIterator, class T, class T1> 4 inline void __uninitialized_fill(ForwardIterator first, 5         ForwardIterator last, const T& x, T1*) 6 { 7     // 利用__type_traits来萃取is_POD_type定义的类型 8     // 并利用其调用更底层的重载实现 9     typedef typename __type_traits<T1>::is_POD_type is_POD;10     __uninitialized_fill_aux(first, last, x, is_POD());11 }

  在__uninitialized_fill()中,我们依旧是利用类型属性萃取类型,萃取了迭代器指向对象类型的属性,获取其is_POD类型的定义,并利用其定义产生临时对象,进行重载,对于不同的情况,进行不同的适当处理。

a.is_POD类型定义为__true_type

 1 // 如果是POD型别,那么copy construction 等同于 assignment,而且 2 // destructor 是trivial,以下就有效 3 // 执行流程就会转进到以下函数。 4 template <class ForwardIterator, class T> 5 inline void  6 __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 7         const T& x, __true_type) 8 { 9     // isPOD的类型定义为__true_type,表示是POD类型10     fill(first, last, x); //调用STL算法fill()    11 }

b.is_POD类型定义为__false_type

 1 template <class ForwardIterator, class T> 2 void 3 __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 4         const T& x, __false_type) 5 { 6     // is_POD定义为__false_type表示不是POD类型,所以只能逐个构造 7     ForwardIterator cur = first; 8     __STL_TRY 9     {10         for (; cur != last; ++cur)11             construct(&*cur, x);12     }13     // commit or rollback14     __STL_UNWIND(destroy(first, cur));15 }

 

4.uninitialized_fill_n函数

  uninitialized_fill_n()也能够使我们将内存配置与对象的建构行为分离开。uninitialized_fill_n(ForwardIterator first,Size n,const T& x),这个函数接受一个前向迭代器,一个指定的初始化初值,和要初始化的个数。基本原理于uninitialized_copy_n一样。uninitialized_fill_n()实现的体系如下:

图3:uninitialized_fill_n()实现的体系

  

  源码如下:

 1 // uninitialized_fill_n的实现 2  3 // 基本原理于uninitialized_copy_n一样 4  5 template <class ForwardIterator, class Size, class T> 6 inline ForwardIterator 7 __uninitialized_fill_n_aux(ForwardIterator first, Size n, 8         const T& x, __true_type) 9 {10     return fill_n(first, n, x);11 }12 13 template <class ForwardIterator, class Size, class T>14 ForwardIterator15 __uninitialized_fill_n_aux(ForwardIterator first, Size n,16         const T& x, __false_type)17 {18     ForwardIterator cur = first;19     __STL_TRY20     {21         for (; n > 0; --n, ++cur)22             construct(&*cur, x);23         return cur;24     }25     __STL_UNWIND(destroy(first, cur));26 }27 28 template <class ForwardIterator, class Size, class T, class T1>29 inline ForwardIterator __uninitialized_fill_n(ForwardIterator first,30         Size n, const T& x, T1*)31 {32     typedef typename __type_traits<T1>::is_POD_type is_POD;33     return __uninitialized_fill_n_aux(first, n, x, is_POD());34 }35 36 // uninitialized_fill_n对外接口37 template <class ForwardIterator, class Size, class T>38 inline ForwardIterator uninitialized_fill_n(ForwardIterator first,Size n,39         const T& x)40 {41     return __uninitialized_fill_n(first, n, value_type(first));42 }

 

5.__uninitialized_copy_copy、__uninitialized_fill_copy和__uninitialized_copy_fill函数

  这几个函数比较简单,都是调用上面的函数就可以实现功能了,就不解释了。直接上源码:

 1 // 拷贝[first1, last1)到[result, result + (last1 - first1)) 2 // 同时拷贝[first2, last2)到 3 // [result + (last1 - first1), result + (last1 - first1) + (last2 - first2)] 4  5 template <class InputIterator1, class InputIterator2, class ForwardIterator> 6 inline ForwardIterator 7 __uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1, 8         InputIterator2 first2, InputIterator last2, ForwardIterator result) 9 {10     ForwardIterator mid = uninitialized_copy(first1, last1, reuslt);11     __STL_TRY12     {13         return uninitialized_copy(first2, last2, mid);14     }15     __STL_UNWIND(destroy(result, mid));16 }17 18 19 // 用x填充[result, mid),同时拷贝[first, last)到[mid, mid + (last - first))20 template <class ForwardIterator, class T, class InputIterator>21 inline ForwardIterator22 __uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid,23         const T& x, InputIterator first, InputIterator last)24 {25     uninitialized_fill(result, mid, x);26     __STL_TRY27     {28         return uninitialized_copy(first, last, mid);29     }30     __STL_UNWIND(destroy(result, mid));31 }32 33 34 // 拷贝[first1, last1)到[first2, first2 + (last1 - first1))35 // 并且用x填充[first2 + (last1 - first1), last2]36 template <class InputIterator, class ForwardIterator, class T>37 inline void38 __uninitialized_copy_fill(InputIterator first1, InputIterator last1,39         ForwardIterator first2, ForwardIterator last2,40         const T& x)41 {42     ForwardIterator mid2 = uninitialized_copy(first1, last1, first2);43     __STL_TRY44     {45         uninitialized_fill(mid2, last2, x);46     }47     __STL_UNWIND(destroy(first2, mid2));48 }

 

三、完整源码stl_uninitialized_wjzh.h

  1 /*************************************************************************  2     > File Name: stl_uninitialized_wjzh.h  3     > Author: wjzh  4     > Mail: wangjzh_1@163.com   5     > Created Time: 2014年11月04日 星期二 17时09分15秒  6  ************************************************************************/  7   8 // 该文件中提供五个全局函数,作用于未初始化空间上   9  10 #ifndef __SGI_STL_INTERNAL_UNINITIALIZED_WJZH_H 11 #define __SGI_STL_INTERNAL_UNINITIALIZED_WJZH_H 12  13 __STL_BEGIN_NAMESPACE 14  15 // uninitialized_copy的实现 16  17 // 如果是POD型别,那么copy construction 等同于 assignment,而且 18 // destruction 是trivial,以下就有效 19 // 执行流程就会转进到以下函数。 20 // POD  意指Plain Old Data,指标量型别或者是传统的C Struct型别 21 // POD型别必须拥有trivial ctor/dtor/copy/assignment函数 22 // 这是藉由function template的参数推导机制而得 23 template <class InputIterator, class ForwardIterator> 24 inline ForwardIterator 25 __uninitialized_copy_aux(InputIterator first, InputIterator last, 26                         ForwardIterator result, 27                         __true_type) 28 { 29     //这里的_true_type 代表迭代器指向的类型是POD型别,不用构造,可以 30     //直接拷贝 31     return copy(first, last, result); 32 } 33  34 template <class InputIterator, class ForwardIterator> 35 ForwardIerator 36 __uninitialized_copy_aux(InputIterator first, InputIterator last, 37                         ForwardIterator result, 38                         __false_type) 39 { 40     //这里的_false_type 代表迭代器指向的类型非POD型别, 41     //不能直接拷贝,需要一个一个的调用其构造函数 42     ForwardIterator cur = result; 43     __STL_TRY 44     { 45         for (; first != last; ++first, ++cur) 46             construct(&*cur, *first); 47         return cur; 48     } 49     //commit or rollback 50     __STL_UNWIND(destroy(result, cur)); 51 } 52  53  54 // __uninitialized_copy-->__uninitilaized_copy_aux 55 // 是为利用编译器的类型参数推导,判断是否是POD类型 56 template <class InputIterator, class ForwardIterator, class T> 57 inline ForwardIterator 58 __uninitialized_copy(InputItearator first, InputIeratorlast, 59         ForwardIterator result, T*) 60 { 61     // is_POD 是一种类型,或者是__true_type代表为真,__ 62     // false_type代表为否,假 63     // 利用is_POD的不同定义,生成不同的临时对象,用其进行重载 64     typedef typename __type_traits<T>::is_POD_type  is_POD; 65     return __uninitialized_copy_aux(first, last, result, is_POD()); 66 } 67  68  69  70 // uninitialized_copy 的函数模板 71 // uninitialized_copy -> __uninitialized_copy 72 // 利用编译器的类型推导,萃取处迭代器指向的类型 73 // 以便最后通过类型萃取__type_traits机制获取迭代器指向类型的一些属性 74 template <class InputIterator, class ForwardIterator> 75 inline ForwardIterator 76 uninitialized_copy(InputIterator first, InputIterator last, 77         ForwardIterator result) 78 { 79     // value_type是个模板函数,萃取迭代器指向类型,用该类型生成临时对象, 80     // 再利用类型推导 81     return __uninitialized_copy(first, last, result, value_type(result)); 82  83 } 84  85 // uninitialized_copy 对于char* 的特化版本 86 inline char* uninitialized_cpoy(const char* first, const char* last, 87         char* result) 88 { 89     //对于char *对其使用memmove效率最高 90     memmove(result, first, last - first); 91     return result + (last - first); 92 } 93  94 // unitialized_copy 对于 wchar_t* 的特化版本 95 inline wchar_t* uninitialized_copy(const wchar_t* first, 96         const wchar_t* last, wchar_t* result) 97 { 98     //同样对于wchar_t *对其使用memmove效率最高 99     memmove(result, first, sizeof(wchar_t) * (last - first));100     return result + (last - first);101 }102 103 104 105 // uninitialized_copy_n 的实现106 107 // input_iterator_tag 是迭代器的分类中的一种,利用迭代器分类类型的不同108 // 可以进行重载,不同的迭代器的类型,会针对其有特定的最优实现109 template <class InputItearator, class Size, class ForwardIterator>110 pair<InputIterator, ForwardIterator>111 __uninitialized_copy_n(InputIterator first, Size count,112         ForwardIterator result, input_ierator_tag)113 {114     // 对于input_iterator_tag类型的迭代器,只能逐个调用构造115     ForwardIterator cur = result;116     __STL_TRY117     {118         for (; count > 0; --count, ++first, ++cur)119             construct(&*cur, *first);120         return pair<InputIterator, ForwardIterator>(first, cur);121     }122     // commit or rollback123     __STL_UNWIND(destroy(result, cur));124 }125 126 template <class RandomAccessItearator, class Size, class ForwardIterator>127 inline pair<RandomAccessIterator, ForwardIterator>128 __uninitialized_copy_n(RandomAccessIterator first, Size count,129         ForwardIterator result, random_ierator_tag)130 {131     // 对于random_iterator_tag类型的迭代器132     // 可以利用first和count计算出last迭代器133     // 然后利用uninitialized_copy(first, last, result)134     // 然而对于input_iterator_tag,就不能135     RandomAccessIterator last = first _count;136     return make_pair(last, uninitialized_copy(first, last, result));137 }138 139 template <class InputIterator, class Size, class ForwardIterator>140 inline pair<InputIterator, ForwardIterator>141 uninitialized_copy_n(InputIterator first, Size count,142         ForwardIterator result)143 {144     // 利用模板函数iterator_category提取出first迭代器的分类型别145     // 然后利用其型别进行重载,对于不同的型别进行不同的优化处理146     return __uninitialized_copy_n(first, count, result,147             iterator_category(first));148 }149 150 151 152 // uninitialized_fii 的实现153 154 // 如果是POD型别,那么copy construction 等同于 assignment,而且155 // destructor 是trivial,以下就有效156 // 执行流程就会转进到以下函数。157 template <class ForwardIterator, class T>158 inline void 159 __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,160         const T& x, __true_type)161 {162     // isPOD的类型定义为__true_type,表示是POD类型163     fill(first, last, x); //调用STL算法fill()    164 }165 166 template <class ForwardIterator, class T>167 void168 __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,169         const T& x, __false_type)170 {171     // is_POD定义为__false_type表示不是POD类型,所以只能逐个构造172     ForwardIterator cur = first;173     __STL_TRY174     {175         for (; cur != last; ++cur)176             construct(&*cur, x);177     }178     // commit or rollback179     __STL_UNWIND(destroy(first, cur));180 }181 182 // 内部的第二层,用于提取迭代器指向的类型是否是POD类型183 // 并利用其进行重载184 template <class ForwardIterator, class T, class T1>185 inline void __uninitialized_fill(ForwardIterator first,186         ForwardIterator last, const T& x, T1*)187 {188     // 利用__type_traits来萃取is_POD_type定义的类型189     // 并利用其调用更底层的重载实现190     typedef typename __type_traits<T1>::is_POD_type is_POD;191     __uninitialized_fill_aux(first, last, x, is_POD());192 }193 194 // uninitialized_fill()对外接口195 template <class ForwardIterator, class T>196 inline void uninitialized_fill(ForwardIterator first, ForwardIterator last,197         const T& x)198 {199     __uninitialized_fill(first, last, x, value_type(first));200 }201 202 203 // uninitialized_fill_n的实现204 205 // 基本原理于uninitialized_copy_n一样206 207 template <class ForwardIterator, class Size, class T>208 inline ForwardIterator209 __uninitialized_fill_n_aux(ForwardIterator first, Size n,210         const T& x, __true_type)211 {212     return fill_n(first, n, x);213 }214 215 template <class ForwardIterator, class Size, class T>216 ForwardIterator217 __uninitialized_fill_n_aux(ForwardIterator first, Size n,218         const T& x, __false_type)219 {220     ForwardIterator cur = first;221     __STL_TRY222     {223         for (; n > 0; --n, ++cur)224             construct(&*cur, x);225         return cur;226     }227     __STL_UNWIND(destroy(first, cur));228 }229 230 template <class ForwardIterator, class Size, class T, class T1>231 inline ForwardIterator __uninitialized_fill_n(ForwardIterator first,232         Size n, const T& x, T1*)233 {234     typedef typename __type_traits<T1>::is_POD_type is_POD;235     return __uninitialized_fill_n_aux(first, n, x, is_POD());236 }237 238 // uninitialized_fill_n对外接口239 template <class ForwardIterator, class Size, class T>240 inline ForwardIterator uninitialized_fill_n(ForwardIterator first,Size n,241         const T& x)242 {243     return __uninitialized_fill_n(first, n, value_type(first));244 }245 246 247 // 拷贝[first1, last1)到[result, result + (last1 - first1))248 // 同时拷贝[first2, last2)到249 // [result + (last1 - first1), result + (last1 - first1) + (last2 - first2)]250 251 template <class InputIterator1, class InputIterator2, class ForwardIterator>252 inline ForwardIterator253 __uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1,254         InputIterator2 first2, InputIterator last2, ForwardIterator result)255 {256     ForwardIterator mid = uninitialized_copy(first1, last1, reuslt);257     __STL_TRY258     {259         return uninitialized_copy(first2, last2, mid);260     }261     __STL_UNWIND(destroy(result, mid));262 }263 264 265 // 用x填充[result, mid),同时拷贝[first, last)到[mid, mid + (last - first))266 template <class ForwardIterator, class T, class InputIterator>267 inline ForwardIterator268 __uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid,269         const T& x, InputIterator first, InputIterator last)270 {271     uninitialized_fill(result, mid, x);272     __STL_TRY273     {274         return uninitialized_copy(first, last, mid);275     }276     __STL_UNWIND(destroy(result, mid));277 }278 279 280 // 拷贝[first1, last1)到[first2, first2 + (last1 - first1))281 // 并且用x填充[first2 + (last1 - first1), last2]282 template <class InputIterator, class ForwardIterator, class T>283 inline void284 __uninitialized_copy_fill(InputIterator first1, InputIterator last1,285         ForwardIterator first2, ForwardIterator last2,286         const T& x)287 {288     ForwardIterator mid2 = uninitialized_copy(first1, last1, first2);289     __STL_TRY290     {291         uninitialized_fill(mid2, last2, x);292     }293     __STL_UNWIND(destroy(first2, mid2));294 }295 296 __STL_END_NAMESPACE297 298 #endif  /* __SGI_STL_INTERNAL_UNINITIALIZED_WJZH_H*/299 300 // End
View Code

 

自己动手实现STL 03:内存基本处理工具(stl_uninitialized.h)