![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL源码剖析
文章平均质量分 85
boat_7
世人皆被命运安排,而我安排命运
展开
-
深入理解红黑树
AVLtree是一个加上了额外条件的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN),直观上的最佳平衡条件是每个节点的左右子树有着相同的高度,我们很难保证插入新元素而又保持这样的平衡条件,AVLtree于是退而求其次,要求任何节点的左右子树高度相差1,这是一个较弱的条件,但任然能保证对数深度平衡条件。假设我们为RB-tree分别插入3,8,35,75,根据二叉搜索树的规则,这四个新节点的落脚点应该如图所示,它们都破坏了RB-tree的规则,因此我们必须调整树型。...原创 2022-07-23 14:50:45 · 127 阅读 · 0 评论 -
深入理解heap
completebinarytree整棵树内没有任何节点漏洞,这带来一个极大的好处我们可以利用array来存储所有节点,假设动用一个小技巧,将array的#0元素保留,那么当completebinarytree中的某个节点位于array的i处时,其左节点必位于array的2i处,其右节点必位于array的2i+1处,其父节点必位于i/2处(此处的"/‘’权且代表高斯符号,取其整数),这种通过array表述tree的方式,我们称为隐式表述法。下面是pop_heap算法的实现细节。...原创 2022-07-20 18:40:25 · 202 阅读 · 0 评论 -
深入理解deque
deque是一种双向开口的连续线性空间,所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,如图所示deque允许常数时间内对起头端进行元素的插入和删除操作,deque没有所谓容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,因此,deque没有必要提供所谓的空间保留功能虽然deque也提高RamdonAccessIterator,但它的迭代器并不是普通指针,这影响了各个运算层次,因此,除非必要,我们应尽可能选择使用vector而非deque。...原创 2022-07-19 17:54:51 · 643 阅读 · 0 评论 -
深入理解list
相较于vector的连续线性空间,list就复杂很多,它的好处是每次插入或者删除一个元素,就配置或释放一个空间,因此,list对于空间的运用有绝对的精准,一点也不浪费以下是STLlist的节点结构:由于STL list是一个双向链表,迭代器必须具备前移,后移的能力,所以list提供的是Bidirectional iteratorslist有一个重要性质:插入操作和接合操作都不会造成原有的list迭代器失效,list的元素删除操作也只有“指向被删除元素”的那个迭代器失效list迭代器的设计list的数据原创 2022-07-14 16:28:43 · 340 阅读 · 0 评论 -
深入理解vector
vector的数据安排以及操作方式与array非常相似,两者的唯一差别在于空间的运用的灵活性,array是静态空间,一旦配置了就不能改变,vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素vector维护的是一个连续线性空间,所以不论其元素型别为何,普通指针都可以作为vector的迭代器而满足所有必要条件,所以vector提供的是Random Access Iteratorsvector的数据结构vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和f原创 2022-07-13 12:22:22 · 226 阅读 · 0 评论 -
深入理解迭代器
不论是泛型思维或STL的实际运用,迭代器都扮演着重要的角色,STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将他们聚合在一起以find()函数为例,它接受两个迭代器和一个"搜寻目标"迭代器是一种行为类似指针的对象指针的最常用也最重要的编程工作就是对operator*和operator->进行重载工作,比如:迭代器相应型别假设算法中有必要声明一个变量,以迭代器所指对象的型别为型别,如何实现?解决办法是:利用function template的参数推导机制,例如:我们以原创 2022-07-11 18:14:23 · 629 阅读 · 0 评论