STL in C++11 (Allocator 1)

这个系列的文章主要探究如何用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

  1. std::uninitialized_fill

template <typename ForwardIterator, typename T>

ForwardIterator uninitialized_fill (ForwardIterator first, ForwardIterator last, 

                                    const T& x);

uninitialized_fill使用x来构造范围在[first, last)间的元素, 并且返回最后被构造元素的下一位置的迭代器

  1. 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个元素, 并且返回最后元素下一位置的迭代器

  1. std::uninitialized_copy

template <typename InputIterator, typename ForwardIterator>

ForwardIterator uninitialized_copy ( InputIterator first, InputIterator last,

                                      ForwardIterator result );

与之前两个函数不同, uninitialized_copy将区间[first, last)的元素复制到以result开始的位置,同样返回指向超尾的迭代器

  1. 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 谢绝转载,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。