uninitialized_fill与fill的区别
在STL源码中可以经常看到uninitialized_fill与fill函数.刚开始不明白到底什么时候
用uninitialized_fill还是fill函数.后来模仿写STL源码时,才明白了,这样做一个简单的说明
希望对初学者有所帮助.
先看看两个函数功能:
1.fill是直接对每个元素进行填充value.
2.uninitialized_fill(未初始化填充) 是要根据value的类型来判断使用哪一种方式填充,
如果是POD类型(就是内置类型或普通结构与类(没有指针的成员数据)),就直接调用fill函数.
不是POD类型时,就要遍历每个元素进行构造(调用construct函数).为什么呢?
那是因为*first = value; 类的赋值操作符必须要*first的对象已经生成.
uninitialized_fill一般都是用于未初化填充,也就是说内存区间根本没有对象可言.
此外相关的还有两个: uninitialized_fill_n, uninitialized_copy.原理一样
uninitialized_fill与fill的源码:(模仿sgi stl)
/*uninitialized_fill --作用于未初始化的内存中
1.迭代器first指向输出端(欲初始化空间)的起始处
2.迭代器last 指向输出端(欲初始化空间)的结束处(前闭后开区间)
3.x表示初值
*/
template <class ForwardIterator, class T>
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 <class ForwardIterator, class T, class T1>
inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*)
{
typedef typename __type_traits<T1>::is_POD_type is_POD; //就是判断是否是普通类型
__uninitialized_fill_aux(first, last, x, is_POD());
}
template <class ForwardIterator, class T>
inline void __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T& x, __true_type)
{
fill(first,last, x); //交由高级函数执行,其实就是直接赋值
}
template <class ForwardIterator, class T>
inline void __uninitialized_fill_aux(ForwardIterator first,ForwardIterator last, const T& x, __false_type)
{
ForwardIterator cur = first;
__LIN_TRY{
for(; cur != last; ++cur)
construct(&*cur, x); //需要构造函数
}
__LIN_UNWIND(destroy(first, cur));
}
//将[first, last)内的所有元素改填新值abcd
template <class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last, const T& value)
{
for(; first != last; ++first) //迭代走过整个区间
*first = value; //设定新值
}