STL定义有五个全局函数,作用于未初始化空间上。这样的功能对于容器的实现很有帮助。前两个函数是用于构造的 construct () 和用于折构的 destroy(),另三个函数是 uninitialized_copy(),uninitialized_fill (),uninitialized_fill_n(),分别对应于高层次函数 copy(),fill(),fill_n()——这些都是STL算法。
uninitialized_fill_n
本函数接受三个参数:
- 迭代器 first 指向欲初始化空间的初始处。
- n 表示欲初始化空间的大小
- x 表示初值
下面是 uninitialized_fill_n 函数的编程实现:
template inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T& x) { return uninitialized_fill_n(first,n,x,value_type(first)); //以上利用 value_type()取出first的 value_type } template inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T& x, T1*) { typedef typename _type_traits::is_POD_type is_POD; return uninitialized_fill_n_aux(first, n, x, is_POD()); } //如果是POD型别,执行流程就会转到以下函数 template inline ForwardIterator uninitialized_fill_n_aux(ForwardIterator first, Size n, const T& x, _true_type) { return fill_n(first,n,x); } //如果不是POD型别,执行流程就会转到以下函数 template ForwardIterator uninitialized_fill_n_aux(ForwardIterator first, Size n, const T& x, _false_type) { ForwardIterator cur = first; for (; n > 0; --n, ++cur) construct(&*cur,x); return cur; }
inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T& x) { return uninitialized_fill_n(first,n,x,value_type(first)); //以上利用 value_type()取出first的 value_type } template inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T& x, T1*) { typedef typename _type_traits::is_POD_type is_POD; return uninitialized_fill_n_aux(first, n, x, is_POD()); } //如果是POD型别,执行流程就会转到以下函数 template inline ForwardIterator uninitialized_fill_n_aux(ForwardIterator first, Size n, const T& x, _true_type) { return fill_n(first,n,x); } //如果不是POD型别,执行流程就会转到以下函数 template ForwardIterator uninitialized_fill_n_aux(ForwardIterator first, Size n, const T& x, _false_type) { ForwardIterator cur = first; for (; n > 0; --n, ++cur) construct(&*cur,x); return cur; }
uninitialized_copy
接受三个参数:
● 迭代器 first 指向输入端的起始位置。
● 迭代器 last 指向输入端的结束位置(前闭后开区间)。
● 迭代器 result 指向输出端(欲初始化空间)的起始处。
下面是 uninitialized_copy 函数的编程实现:
template
inline ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result)
{
return _uninitialized_copy(first, last, result, value_type(result));
//以上利用value_type()取出first的value_type
}
template
inline ForwardIterator _uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result, T*)
{
typedef typename _type_traits::is_POD_type is_POD;
return _uninitialized_copy_aux(first,last,result,is_POD());
}
//如果是POD型别,执行流程就会转到以下函数
template
inline ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _true_type)
{
return copy(first,last,result);
}
//如果不是POD型别,执行流程就会转到以下函数
template
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _false_type)
{
ForwardIterator cur = result;
for (; first != last; ++first, ++cur)
construct(&*cur,*first);
return cur;
}
inline ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result)
{
return _uninitialized_copy(first, last, result, value_type(result));
//以上利用value_type()取出first的value_type
}
template
inline ForwardIterator _uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result, T*)
{
typedef typename _type_traits::is_POD_type is_POD;
return _uninitialized_copy_aux(first,last,result,is_POD());
}
//如果是POD型别,执行流程就会转到以下函数
template
inline ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _true_type)
{
return copy(first,last,result);
}
//如果不是POD型别,执行流程就会转到以下函数
template
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, _false_type)
{
ForwardIterator cur = result;
for (; first != last; ++first, ++cur)
construct(&*cur,*first);
return cur;
}
uninitialized_fill
接受三个参数:
● 迭代器 first 指向输出端(欲初始化空间)的起始处。
● 迭代器 last 指向输出端(欲初始化空间)的结束处(前闭后开区间)。
● x 表示初值。
下面是 uninitialized_fill 函数的编程实现:
template
inline void uninitialized_fill(ForwardIterator first,ForwardIterator last,const T& x)
{
_uninitialized_fill(first, last, x, value_type(first));
//以上利用 value_type()取出first的 value_type
}
template
inline void _uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*)
{
typedef typename _type_traits::is_POD_type is_POD;
_uninitialized_fill_aux(first, last, x, is_POD());
}
//如果是POD型别,执行流程就会转到以下函数
template
inline void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _true_type)
{
fill(first, last, x); //调用STL算法fill()
}
//如果不是POD型别,执行流程就会转到以下函数
template
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _false_type)
{
ForwardIterator cur = first;
for (; cur!=last;++cur)
construct(&*cur, x);
}
inline void uninitialized_fill(ForwardIterator first,ForwardIterator last,const T& x)
{
_uninitialized_fill(first, last, x, value_type(first));
//以上利用 value_type()取出first的 value_type
}
template
inline void _uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*)
{
typedef typename _type_traits::is_POD_type is_POD;
_uninitialized_fill_aux(first, last, x, is_POD());
}
//如果是POD型别,执行流程就会转到以下函数
template
inline void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _true_type)
{
fill(first, last, x); //调用STL算法fill()
}
//如果不是POD型别,执行流程就会转到以下函数
template
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, _false_type)
{
ForwardIterator cur = first;
for (; cur!=last;++cur)
construct(&*cur, x);
}