STL剖析
文章平均质量分 58
浊酒x
这个作者很懒,什么都没留下…
展开
-
(第十四步) STL: alloc内存配置器解析
对于创建自己的STL库来说,重点就在于alloc配置器,其他大部分还是好理解的alloc 配置器std::alloc在源码中考虑小型区块的碎片化问题,存在两级配置器:第一级配置器用来申请超过内存块容量(128byte)的内存,并管理第二级的作用是完成std::alloc对内存的分配。一级配置器主要在于malloc和free的应用,就不做多的解释,配置器的精髓都在二级配置器中。二级配置器二级空间配置器使用内存池+自由链表的形式避免了小块内存带来的碎片化,提高了分配的效率,提高了利用率。SGI原创 2021-08-15 19:59:19 · 613 阅读 · 0 评论 -
(第十三步) STL: stl_map容器实现
map特性:所有元素都会根据元素的键值自动被排序map 的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。总体性质和set区别不大,多了一个实值,KeyOfValue 要从证同identity变成选择select,所以对仿函数functional文件进行了一些功能添加实现功能begin()end()constempty()size()clear()find(val)inse原创 2021-08-14 23:02:45 · 233 阅读 · 0 评论 -
(第十二步) STL: stl_set容器实现
set特性:set所有元素都会根据元素的键值自动被排序。set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。正常set的迭代器不可以改变set的元素值,但是前面红黑树迭代器设计偷了个懒,导致没能设计好const_iterator,其他的性能没有问题。set设计完全使用红黑树的底层机制,所使用的接口完全由红黑树所提供的,因此set实现非常简单,都是调用红黑树的操作。实现功能begin()end()constempty()size()clear()find(原创 2021-08-14 23:01:43 · 185 阅读 · 0 评论 -
(第十一步) STL: stl_rb_tree容器实现
RB-tree红黑树的重要性,不言而喻,是一种插入和删除都为O(log(N))O(log(N))O(log(N))的数据结构,具体原理可以看这个:红黑树插入和删除分析之后程序的编写,和注释红黑树重平衡的情况也是对照上文的情况的,这里就不多做介绍,直接开始程序设计设计的重点首先根据侯捷书,所述的迭代器之间的关系图,但是我这里直接放在一起,没有分的很细致,设计迭代器然后红黑树结构设计,引入了一个header结点,来表示根节点的父节点且为红色当红黑树处于初始状态时,只有header节点(为红色)原创 2021-08-13 00:14:48 · 389 阅读 · 0 评论 -
(第十步) STL: stl_binary_search_tree容器实现
binary search tree二叉搜索树性质挺简单的就不多说, 解决小问题,为后面的红黑树做个小铺垫binary search tree设计empty() 树是否为空erase(val) 删除指定元素insert(val) 添加指定元素size() 树上结点数量depth() 返回树的深度cbegin() 返回树的最小值迭代器cend() 返回树的末尾迭代器find(val) 寻找值find_min() 寻找最小值find_max() 寻找最大值print_inorder(原创 2021-08-10 17:58:08 · 178 阅读 · 0 评论 -
红黑树的插入和删除详解
红黑树RB-tree找了很多其他人的,红黑树的插入大部分都能理解,在删除部分有些博客很难理解进行,就自己写了一篇详细的,有问题欢迎请指出。作为一种广泛应用的平衡二叉搜索树之一,需要我们有些清晰的了解红黑树的结点增删改查效率非常优良,都为log(N),其应用十分广泛:Linux内核进程调度由红黑树管理进程控制块。Epoll用红黑树管理事件块。C++ STL中的map和set的底层实现。用于理解红黑树的生成演示网站:https://www.cs.usfca.edu/~galles/visual原创 2021-08-10 00:24:28 · 1663 阅读 · 1 评论 -
(第九步) STL: stl_string容器实现
stl_string经过前面其他容器的是学习, string的实现很容易理解,没有什么太大的突出点,平常用到也很多,应该挺熟悉的,也就不多做什么解释,直接copy了代码,进行大致修改,使得能运行。测试程序也不给了,但是这里测试的时候加载头文件,说我重复定义,把stl_string.h头文件,从test.h移动到test.cpp下才可以实现,有知道的希望可以留个言。这里实现string是为了后面的二叉搜索树、平衡二叉树等等实现做准备,也可以直接copy着用也是从这里,序列式的容器差不多告一段落了,之后原创 2021-08-07 15:03:09 · 127 阅读 · 0 评论 -
(第八步) STL: stl_priority_queue容器实现
priority queuepriority_queue带有权值观念,其内的元素并非依照被推人的次序排列,而是自动依照元素的权值排列(通常权值以实值表示),权值最高者,排在最前面。priority_queue利用一个max-heap完成,map-heap是一个以vector表现的complete binary tree 。 max-heap可以满足priority_queue所需要的“依权值高低自动递增排序”的特性。理解完上一节中的max-heap,很容易就理解priority queue的概念。原创 2021-08-07 10:56:55 · 124 阅读 · 0 评论 -
(第七步) STL: heap算法实现
该算法内容放在Algorithm.h中heap并不归属于STL容器组件,用于辅助实现priority queue。priority queue允许用户以任何次序将任何元素推入容器内,但取出时一定是从优先权最高(也就是数值最高)的元素开始取。binary max heap正是具有这样的特性,适合作为priority queue的底层机制。选择方法的分析: list:虽然插入、删除可以常数时间,但是找极值需要遍历 红黑树:插入、找极值都是,但是实现较为复杂 binar原创 2021-08-07 10:49:49 · 292 阅读 · 0 评论 -
(第六步) STL: stl_queue容器实现
queuequeue同stack类似的设计,本身是一种单向出口的FIFO的数据结构使用双向的数据结构都能实现,就如前面设计的list、dequevector是尾部单向,可以做stack,但是不能做queuelist的 == 、!=存在问题,其他功能完好deque可以实现,这里使用deque实现queuequeue设计 操作 比较和分配队列 empty() 队列为空则返回真 pop() 移除队头元素 push() 在队尾增加元素 s原创 2021-08-06 21:18:02 · 174 阅读 · 0 评论 -
(第五步) STL: stl_stack容器实现
stackstack的设计非常简单,本身是一种单向出口的FILO的数据结构使用双向的数据结构都能实现,就如前面设计的list、dequevector是尾部单向的,也可以作为实现原理前面的deque需要改程序参数list的 == 、!=存在问题,其他功能玩好vector没有问题,这里使用vector实现stackstack设计 操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素原创 2021-08-06 21:14:41 · 195 阅读 · 0 评论 -
(第四步) STL: stl_deque容器的实现
deque 是连续空间(逻辑上是这样的),实际上 deque 是由一段一段的连续空间构成,一旦需要在 deque 的头部和尾部增加存储空间,便配置定量连续的内存空间,串接在整个 deque 的头部或者尾部。deque 采用映射(map)作为主控,也就是中控器。这里的map是一小块连续空间,其中每个元素都是指针,每个指针都指向一段定量连续空间,也叫作缓冲区,缓冲区才是 deque 的主体。当我们申请对象开辟内存的时候,如果没指定缓冲区大小,默认为512bytes,注意开辟内存存的是指针,缓冲区才是存数据。原创 2021-08-06 21:04:06 · 169 阅读 · 0 评论 -
(第三步) STL: Function.h解析
在sort中用到了functional中函数,默认排序从小到大, 这是是非常简单的一个类,提供了小于和相等两个函数供调用,可以直接放上代码,直接明了的/** functional是非常简单的一个类,提供了小于和相等两个函数供调用**/#ifndef _FUNCTIONAL_H_#define _FUNCTIONAL_H_namespace mySTL{ //********** [less] **************** template&l...原创 2021-08-02 20:25:16 · 525 阅读 · 0 评论 -
(第二步) STL: stl_list容器的实现
stl_list容器STL标准模板库中实现的是双向环形链表,这里就实现了普通双向链表stl_list.h#ifndef _LIST_H_#define _LIST_H_#include "../Includes/Allocator.h"#include "../Includes/Iterator.h"#include "../Includes/ReverseIterator.h"#include "../Includes/UninitializedFunctio...原创 2021-08-02 20:13:16 · 225 阅读 · 0 评论 -
(第一步) STL: stl_vector容器实现
简略版:https://blog.csdn.net/qq_38223012/article/details/119278445可以实现基本功能这是完整版,扩展后学习的stl_vector.h#pragma once#ifndef _STL_VECTOR_H_#define _STL_VECTOR_H_#include "../Includes/TypeTraits.h"#include "../Includes/Algorithm.h"#include "../Inclu原创 2021-08-06 21:31:28 · 219 阅读 · 0 评论 -
(第一步) STL: stl_vector容器简略版实现
stl_vector容器本文参考了这位大佬的github,直接先使用了它的基本头文件,在此基础上创建实现自己容器,反向理解底层代码 Alloc.h 分配内存,使用二级配置器 TypeTraits.h 类型萃取 Construct.h 容器的构造和析构 Allocator.h alloc.h和construct.h的直接上级,封装函数 Itearator.h 迭代器 Functional.h 实现小于和等于 Utility.h 算法中使用,原创 2021-07-31 17:42:48 · 226 阅读 · 0 评论