stl源码剖析
文章平均质量分 72
却道天凉_好个秋
这个作者很懒,什么都没留下…
展开
-
stl源码剖析10——仿函数
可参考:https://dongshao.blog.csdn.net/article/details/104303680原创 2021-03-24 23:18:58 · 114 阅读 · 0 评论 -
stl源码剖析09——RB-Tree(红黑树)
一、红黑树定义红黑树(RB-tree)也是广泛应用的平衡二叉树 红黑树必须满足下面的规则: 1.每个节点不是红色就是黑色 2.根节点为黑色 3.如果节点为红色,那么子节点必须为黑(也就是说不能有两个节点连续为红色) 4.任一节点到NULL(树尾端)的任何路径上,所含的黑色节点数目必须相同 下图是一个图示。深色的为黑色,浅色的为红色二、插入节点新插入的节点必为红色如果插入前树非空,插入的新节点为黑色,肯定不满足上面的规则4 如果插入前树非空,插入的新节点为红色,那么转载 2021-02-25 00:20:24 · 789 阅读 · 1 评论 -
stl源码剖析08——平衡二叉树
一、二叉搜索树所谓二叉搜索树,可提供对数时间的元素插入和访问 节点放置规则:任何节点的键值一定大于其左子树的每一个节点的键值;并小于其右子树中的每一个节点的键值最大值、最小值: 最小值:从根节点出发,一直往左走,直至无左路可走,即得到最小元素 最大值:从根节点出发,一直往右走,直至无右路可走,即得到最大元素 二叉搜索树的查找从根节点出发,根据值的大小,逐个向左或向右查找,就可以查找到元素二叉搜索树的插入插入新元素时,从根节点开始,遇键值较大者就向左,遇键值较小者就向右,一转载 2021-02-24 23:45:01 · 205 阅读 · 0 评论 -
stl源码剖析07——常见容器的时间复杂度总结
map set multimap multiset以上四种容器是采用红黑树实现,对应操作的复杂度为:插入:O(logN)查看:O(logN)删除:O(logN)hash_map hash_set hash_multimap hash_multiset以上四种容器是利用哈希表实现,对应操作的时间复杂度为:插入:O(1) 最差为O(N)查看:O(1) 最差为O(N)删除:O(1) 最差为O(N)...原创 2021-02-24 23:33:47 · 156 阅读 · 0 评论 -
stl源码剖析06——deque
一、deque概述deque的使用语法:https://blog.csdn.net/qq_41453285/article/details/105483037 总的来说:是一个双端队列 特点: 支持快速随机访问(支持索引取值) 在头尾插入/删除速度很快 deque是非常复杂的数据结构,由多个vector组成,迭代器使用时会在不同的区间跳转 存取元素的时候,deque的内部结构会多出一个间接过程,相比vector操作会慢一些 对内存有限制的系统中,deque比vector可以包含更多转载 2021-02-22 23:17:28 · 158 阅读 · 0 评论 -
stl源码剖析05——set、map源码剖析
一、setset语法使用参阅:https://blog.csdn.net/qq_41453285/article/details/105483473set的特性set所有元素都会根据元素的键值自动被排序 set中的键值就是实值,实值就是键值 默认情况下set不允许两个元素重复set的迭代器不能根据set的迭代器改变set元素的值。因为其键值就是实值,实值就是键值,如果改变set元素值,会严重破坏set组织 在后面的源码中会看到,set的迭代器set<T>::iter转载 2021-02-19 11:51:41 · 202 阅读 · 0 评论 -
stl源码剖析04——list
一、list概述list的使用语法:https://blog.csdn.net/qq_41453285/article/details/105483054 总的来说:环形双向链表 特点: 底层是使用链表实现的,支持双向顺序访问 在list中任何位置进行插入和删除的速度都很快 不支持随机访问,为了访问一个元素,必须遍历整个容器 与其他容器相比,额外内存开销大 设计目的:令容器在任何位置进行插入和删除都很快 何时使用: 容器需要不断地在中间插入或删除元素 无论删除还是增加,l转载 2021-02-18 15:02:07 · 130 阅读 · 0 评论 -
stl源码剖析03——vector
一、vector概述vector的使用语法可以参考文章:https://blog.csdn.net/qq_41453285/article/details/105483009 总的来说:vector是可变大小数组 特点: 支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 元素保存在连续的内存空间中,因此通过下标取值非常快 在容器中间位置添加或删除元素非常耗时 一旦vector内存不足,重新申请内存之后,和原vector相关的指针,引用,迭代器都失效。内存重分配耗时很长 通转载 2021-02-16 16:56:39 · 117 阅读 · 0 评论 -
stl源码剖析02——iterator源码剖析与Traits编程技术/偏特化
一、迭代器相应类型前文介绍了迭代器的雏形,在使用迭代器的时候,我们可能需要知道这个迭代器所指之物的数据类型,但是C++不支持typeof()这种机制,因此我们需要一种技术来获取迭代器所指之物的类型参数推导机制参数推导机制可以让我们推断出参数的数据类型template<class I,class T> //此例中,T为intvoid func_impl(I iter, T t){ T tmp; //...}template<class I转载 2021-02-15 16:00:27 · 170 阅读 · 0 评论 -
stl源码剖析01——迭代器
1. 迭代器概述不论是泛型思想或是STL的实际运用,迭代器都扮演着重要的角色 STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一种胶着剂将它们撮合在一起2. 迭代器是独立于容器和算法而存在的下面介绍一个容器、算法、迭代器在一起使用的案例演示案例下面是find()算法的源码(摘录于<stl_algo.h>)template<class InputIterator,class T>InputIterator find(InputIterat转载 2021-02-15 15:06:23 · 160 阅读 · 0 评论 -
stl中六大部件概述
1. 概述STL的6大部件包括:容器(Container)、分配器(Allocator)、算法(Algorithm)、迭代器(Iterator)、适配器(Adapter)、仿函数(Functor)。2. 部件之间的关系1.容器:存放我们要操作的数据,可以是数字、对象等;2.分配器:容器需要占用内存,容器占用的内存由分配器分配;3.算法:被独立出来的模板函数,用来操作容器,包块常见的排序算法、查找算法等;4.迭代器:算法既然要操作容器中的数据,需要有工具访问容器中数据,那就是迭代器,是原创 2021-01-19 00:43:54 · 971 阅读 · 0 评论 -
一个万用Hash Function的实例
#include <unordered_set>#include <iostream>using namespace std;template <typename T>inline void hash_combine(size_t& seed, const T& val){ seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> .原创 2020-12-08 00:34:32 · 287 阅读 · 0 评论 -
浅析stl仿函数
1. 仿函数的概念仿函数(functors)是早期的命名,c++标准规格定案后所采用的新名称是函数对象(function objects)。仿函数是一个能行使函数功能的类,必须重载operator()运算符,调用仿函数,就是通过类对象调用重载后的operator运算符。2. 仿函数的主要作用以stl中的仿函数为例,stl中的提供的算法,往往有两个版本,一个是最直观的某种运算,另一种是泛化的演算流程,允许用户"以template参数来指定所要采行的策略",仿函数通常用于指定某种操作来当作算法的参数原创 2020-11-20 00:39:04 · 345 阅读 · 0 评论 -
stl源码分析——map/multimap
1. 概念map是一种关联式容器。map中所有元素都会根据元素的键值自动排序。map中所有的元素都是pair,同时拥有key和value。2. 源码分析以G2.9为例,以下是map的部分源码实现:template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>class map{public: typedef Key key_type; type原创 2020-11-06 23:10:53 · 273 阅读 · 0 评论 -
stl源码分析——set/multiset
1. 概念set是一种关联式容器。set是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序(依赖于红黑树中自动排序的实现)。2. 源码分析以G2.9为例,以下为set的部分源码实现:template<class Key, class Compare = less<Key>, class Alloc = alloc>class set{public: //typedefs t原创 2020-11-06 00:16:10 · 163 阅读 · 0 评论