STL学习笔记-2.3内存基本处理工具

2.3 内存基本处理工具

这里面主要包括了三个函数

  • uninitialized_copy()
  • uninitialized_fill()
  • uninitialized_fill_n()

对应着高层次的函数

  • copy()
  • fill()
  • fill_n()

这些都是STL算法。

uninitialized_copy()

讲某一区间的内容复制到另一个区间:

  • 配置内存区块,足以包含范围内的所有元素
  • 使用该函数,在该内存区块上构造元素

C++标准中要求这个函数具有“commit or rollback”的语义,其实也就是让这个操作原子话,当某个copy constructor失败时回滚所有已发生的操作。

接受三个参数:

  • 迭代器first指向输入端的起始位置
  • 迭代器last指向输入端的结束位置(前闭后开区间)。
  • 迭代器result指向输出端(欲初始化空间)的起始处。

uninitialized_fill()

对于范围内的所有区块,都构造一个给定的内存内容。同样要求有原子性。

uninitialized_fill_n()

类似前者,从first位置开始,构造n个第三参数的复制品。同样也在标准中要求原子性

本函数接受三个参数:

  • 迭代器first指向欲初始化空间的起始处。
  • n表示欲初始化空间的大小
  • x表示初值
1
2
3
4
5
template <class ForwardIterator, class Size, class T>
inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n,
const T& x) {
return __uninitialized_fill_n(first, n, x, value_type(first));
}

这段代码先取出迭代器first的value type,然后判断该类别是否为POD类别。POD也就是Plain Old Data也就是标量型或传统的C struct类别。POD类别拥有trivial ctor/dtor/copy/assignment函数,因此对POD类别采用最有效率的初值填写手法,而对非POD类别采用最保险安全的做法。

分享到