这个系列的文章主要探究如何用C++11写出自己的STL容器,在实现的过程中也参考了侯捷的《STL源码剖析》,希望可以给其他人提供帮助。这篇文章是本系列的第一作,主要介绍与描述分配器Allocator。
虽说Allocator是整个STL代码的基础,而且也是首先要实现的部分,但它的理解与实现难度实在不低。如果对指针没有足够的了解的话,可能会造成理解上的困难,不过作者也会尽可能清楚的讲述Allocator的原理。
再正式进入Allocator前, 我们先来看一些C++11的语法
1. 定位new运算符
基础语法:new (p) T(value)
上面的意思是在指针p的位置上以value为参数构造类型为T的对象
很多人可能会疑惑为什么要这么用new呢,直接 *p 赋值不好吗?
其实这么做是有问题的,我们这样需要调用赋值运算符,多进行了一次赋值。我们可以通过定位new直接调用构造函数而不产生其他副作用。
2. std::uninitialized_xxx
- std::uninitialized_fill
template <typename ForwardIterator, typename T>
ForwardIterator uninitialized_fill (ForwardIterator first, ForwardIterator last,
const T& x);
uninitialized_fill使用x来构造范围在[first, last)间的元素, 并且返回最后被构造元素的下一位置的迭代器
- std::uninitialized_fill_n
template <typename ForwardIterator, class Size, typename T>
ForwardIterator uninitialized_fill_n (ForwardIterator first, Size n, const T& x);
同样,uninitialized_fill_n使用x构造从first开始的n个元素, 并且返回最后元素下一位置的迭代器
- std::uninitialized_copy
template <typename InputIterator, typename ForwardIterator>
ForwardIterator uninitialized_copy ( InputIterator first, InputIterator last,
ForwardIterator result );
与之前两个函数不同, uninitialized_copy将区间[first, last)的元素复制到以result开始的位置,同样返回指向超尾的迭代器
- std::uninitialized_copy_n
template <typename InputIterator, typename Size, typename ForwardIterator>
ForwardIterator uninitialized_copy_n ( InputIterator first, Size n,
ForwardIterator result );
同理, uninitialized_copy_n将从first开始的n个元素复制到以result开始的位置
有了上面的4个函数,我们就可以进行容器内元素的初始化了。那么我们为什么不直接使用STL中的copy(), copy_n(), fill(), fill_n()呢? 原因在于它们可以根据不同的情况使用最优的方法进行初始化,从而达到最高的效率,而具体是如何实现的就请等待之后的文章了。
好吧,虽然开始是想讲讲分配器的,但写着写着发现要说的铺垫有点多,还有一些额外的东西需要讲明白,那就只好先把进度推迟了。下一篇应该还是讲不到Allocator, 主要内容应该是实现一些需要准备的工具函数。(所以我也不知道什么时候能够进入正题 笑~)
那么就到这里了,喜欢的可以关注啊
最后再附上github地址:https://github.com/Puppas/STL-in-Cpp11
下一篇: STL in C++11 (Allocator 2)
P.S 谢绝转载,谢谢