【MySTL实现】
吾之求索
https://github.com/Small-Cube
展开
-
C++-----MySTL实现(1)---构造和析构基本工具
1、相关 根据侯捷老师的STL源码解析以及SGI-STL-2.9版本实现。本文是第一篇,实现基本的构造和析构函数。所有相关的注释均在代码中注明,其中所需要的迭代器操作和萃取操作在之后实现,这里需要知道它们的用途。2、代码/** 定义了五个全局函数——construct(), destroy(),* uninitialized_copy(),unini...原创 2019-05-15 10:28:40 · 538 阅读 · 0 评论 -
C++-----MySTL实现(2)---内存基本处理工具
1、相关 STL定义了五个全局函数,作用域为初始化空间上,这样的功能对于容器的实现很有帮助,在后面的容器实现代码中会看到他们的作用,前两个函数是在上一篇实现的用于构造的construct()和用于析构的destroy()。另外三个在本节实现。其中用到几个算法比如copy()和fill()等,将在后面算法中实现,这里知道含义即可。2、代码/**STL中有五个全局函数作用...原创 2019-05-15 10:34:11 · 314 阅读 · 0 评论 -
C++-----MySTL实现(3)---copy函数和fill函数
1、相关 copy函数在前面内存基本处理工具中使用过,STL中的copy函数是十分复杂的,复制操作不外乎是运用赋值操作或者拷贝构造函数,copy所用的是前面的,有时候传入copy函数的元素型别是trivial assignemnt operator,因此如果能够直接使用内存直接复制行为(memove或memcpy)便能够节省大量的时间。因此STL中copy算法用尽各种办法包括函数...原创 2019-05-20 21:36:23 · 399 阅读 · 0 评论 -
C++-----MySTL实现(3)---Traits编程技法
1、相关 很多时候我们需要根据类型的不同来调用不同的函数,在析构和构造工具的实现中,destroy函数有两个版本,第二个版本的实现用到了value_type(first)来获取迭代器的类型,在内存处理工具中,也有很多地方用到这种方式来获得一些模板的类型。其实找到相对应的源码,会发现其实他们是通过模板的泛化、特化和偏特化实现的。关于特化、偏特化可以查看这篇C++ primer关于模...原创 2019-05-16 20:48:51 · 227 阅读 · 0 评论 -
C++-----MySTL实现(4)---迭代器实现
1、相关 iterator.h文件其实并不涉及具体的哪一个容器的迭代器,只是定义了一些统一的标准,比如迭代器相应的型别,比如一个算法需要用到迭代器所指对象的型别,而怎么获得型别在前面traits编程已经说过。根据经验,最常用到的迭代器的型别有五种,value type,difference type,pointer,reference,iterator catagoly。 v...原创 2019-05-22 21:38:01 · 570 阅读 · 0 评论 -
C++-----MySTL实现(5)---空间配置器实现(alloc)
1、相关 前面实现的四部分其实都是为这一章做准备。首先我们来看,STL一共有六大组件:容器、算法、迭代器、仿函数、配接器、配置器。前面迭代器的实现其实只是定义了一些标准,不是真正的迭代器实现,真正的迭代器实现会放在每一个容器里,而容器的实现需要一个基本的功能就是内存分配。这一部分就来实现空间配置器allocator。 在STL的源码里,allocator这个分配...原创 2019-05-29 21:41:56 · 627 阅读 · 1 评论 -
C++-----MySTL实现(6)---vector的实现
1、相关 前面五个章节都是容器实现的一些基础工作,尤其是迭代器和空间配置器。这两个是实现容器最基础的,一个用来给容器分配空间,一个提供接口以便算法访问容器中的元素。 vector是动态数组,随着元素的加入内部会自动扩充空间容纳新元素,这也是vector实现的难点。vector是一个连续的线性空间,不管其内部放的是什么元素,使用普通指针均可以作为其迭代器,而vec...原创 2019-06-04 22:03:16 · 364 阅读 · 0 评论 -
C++-----MySTL实现(6)-----list的实现
1、相关 在STL中,list是一个双向带环链表。list不能像vector那样使用普通指针作为迭代器,因为其节点在存储空间中不一定连续存在,list的迭代器必须有能力指向list的节点,这样才能正确的递增(指向下一个节点)、递减(指向上一个节点)、取值成员(取节点的数据值)存取等操作,由于STL list是一个双向链表,迭代器必须具备前移,后移的能力,所以list的迭代器类型是...原创 2019-06-11 20:59:33 · 439 阅读 · 0 评论