uninitialized_fill与fill的区别

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;				//设定新值
	}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值