template<classT,classR>inline R uninitialized_copy(T first, T last, R result){using isPODType =typename_type_traits<value_type_t<T>>::is_POD_type;return__uninitialized_copy_aux(first, last, result,isPODType());// 调用括号运算符/ 对象}template<classT,classR>inline T __uninitialized_copy_aux(T first, T last, R result, _true_type){returnMiniSTL::copy(first, last, result);// first到last 复制到result pod 普通类型}template<classT,classR>inline T __uninitialized_copy_aux(T first, T last, R result, _false_type){// 非pod类型
R cur = result;for(; first != last; first++, cur++){construct(&*cur,*first);// 在cur地址 构造值为*first的值的对象}return cur;}inlinechar*uninitialized_copy(constchar* first,constchar* last,char* result){memmove(result, first, last - first);return result +(last - first);}inlinewchar_t*uninitialized_copy(constwchar_t* first,constwchar_t* last,wchar_t* result){memmove(result, first, last - first);return result +(last - first);}
// 区间填充valuetemplate<classT,classR>inlinevoiduninitialized_fill(T first, T last,const R& value){using isPODType =typename_type_traits<value_type_t<T>>::is_POD_type;__uninitialized_fill_aux(first, last,isPODType());}template<classT,classR>inlinevoid__uninitialized_fill_aux(T first, T last,const R& value, _true_type){MiniSTL::fill(first, last, value);}template<classT,classR>inlinevoid__uninitialized_fill_aux(T first, T last,const R& value, _false_type){
T cur = first;for(; cur != last; cur++){construct(&*cur, value);}}
template<classT1,classT2,classT3>inline T1 uninitialized_fill_n(T1 first, T2 n,const T3& value){// 从first开始 的n个数填充为valueusing isPODType =typename_type_traits<T1>::is_POD_type;return__uninitialized_fill_n_aux(first, n , value,isPODType());}template<classT1,classT2,classT3>inline T1 __uninitialized_fill_n_aux(T1 first, T2 n,const T3 &value,_true_type){returnMiniSTL::fill_n(first, n, value);}template<classT1,classT2,classT3>inline T1 uninitialized_fill_n_aux(T1 first, T2 n,const T3& value, _false_type){
T1 cur = first;for(; n >0; n--,cur++){construct(&*cur, value);}return cur;}
template<classT1,classT2,classT3>inline T1 uninitialized_copy_copy(T1 first1, T1 last1, T2 first2, T2 last2, T3 result){// f1 l1 放到res之后,f2,l2再放到res之后
T1 mid =MiniSTL::uninitialized_copy(first1, last1, result);try{returnMiniSTL::uninitialized_copy(first2,last2, mid);}catch(const std::exception& e){// res 此时还在开头 如果有误,将原来拷贝的销毁,一致性操作destory(result, mid);throw;}}