![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL源码剖析
STL源码
苞米地里捉小鸡
程序蒟蒻
展开
-
C++:在堆上创建对象,还是在栈上?
这篇文章来自于一次讨论:http://www.devbean.net/2013/01/qt-study-road-2-model-view/#comment-17532。关于究竟是在堆上还是在栈上创建对象,可能很多初学者感到迷惑。我想可以把这部分内容拿出来详细介绍一下。现在,假设你已经清楚什么是堆,什么是栈。如果需要在堆上创建对象,要么使用new运算符,要么使用malloc系列函数。这点没有异...原创 2020-04-12 10:58:35 · 370 阅读 · 0 评论 -
算法(2)-基本算法
1. equal如果第二序列元素多,则多余的不考虑2 fill 填充新值fill_n在指定的区间填入新值3 iter_swap将两个迭代器指向的元素对调4 max和min取两个对象的较大较小值min类似5 mismatch比较两个序列,指出两者之间的第一个不匹配点,返回一对迭代器,分别指向两个序列中的不匹配...原创 2020-04-11 00:57:03 · 81 阅读 · 0 评论 -
STL算法(1)
1.质变算法提供两个版本,一个是in_place(就地),一个是copy(异地),copy版总是以_copy作为函数名称尾词sort没有copy版本有些函数有仿函数版本,会在有仿函数版本的后面加上_if作为尾词2. 算法一般包含在algorithm头文件中,该头文件又包含<stl_numeric.h><stl_algo.h><stl_algobase.h&...原创 2020-04-10 23:03:47 · 99 阅读 · 0 评论 -
关联式容器之RB-tree红黑树
1.每个节点不是红色就是黑色2.根节点是黑色3.如果节点为红,其子节点必须为黑4.任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同这意味着新增节点必须为红、新增节点之父节点必须为黑(主要条件),如果不满足则必须调整颜色并且旋转树形5 总结(当P父亲为红,插入节点X为红时,会产生冲突的解决方法)外侧插入、伯父节点为黑,那么单旋转一次内...原创 2020-04-10 17:24:45 · 246 阅读 · 0 评论 -
heap & proority_queue
1.heap堆并不归属于STL容器组件2. priority queue优先队列:取出时按优先权最高(数值大小)的元素开始取3. 二叉树的一个节点位于i位置,那么左子节点一定位于2i处,右子节点一定位于2i+1处,其父节点一定位于i/2处。4 最大堆添加新元素的时候,将新节点拿来与父节点进行比较,如果其key大于父节点,那么父子对换位置,如此循环上溯,知道不需要对换或者到达根节点为止。...原创 2020-04-10 09:55:21 · 92 阅读 · 0 评论 -
序列式容器stack与queue
1. 先进后出2. stack允许新增元素,移除元素,但是都只能在最顶端进行操作3. 其实stack是以deque为底部容器完成工作的,所以STL stack往往称为适配器4.5. 因为stack增加、删除操作都是在顶部进行的,所以stack不提供遍历等功能,因此不提供迭代器。6. 除了deque外,list也可以作为stack 的底层容器只需要将模板的第二个参数改为l...原创 2020-04-02 23:28:07 · 132 阅读 · 0 评论 -
STL源码——序列式容器deque
1.2. 原书deque有错误应该修改为typedef _deque_iterator<T,Ref,Ptr,BufSiz> self不然不知道self到底是什么类型,太坑人了,在这里我还想了好久。3.cur这个指针每次更换缓冲区都要重新更新。4.5. last指向的是一个缓冲区的尾,什么叫尾,就是最后一个元素的下一个位置6. eras...原创 2020-04-02 23:00:03 · 122 阅读 · 0 评论 -
STL源码——序列式容器list
1. list即链表优点:插入、移除方便缺点:查找不方便,每次都需要从头开始查slist是单向链表我们常说的list表示环状双向链表2. list节点结构3. 将头结点设为尾端的一个空白节点可以将这个空白节点称为Flag节点4.向list插入一个元素其实是插入在迭代器所在位置之前那个位置5. erase原理:将要移...原创 2020-04-02 15:57:41 · 112 阅读 · 0 评论 -
STL源码——vector
1. 归类2. vector的迭代器vector支持随机存取,所以将其设置为Random Access Iterators 即普通指针类型即可比如ivite的类型是int * 而svite是Shape*3. vector迭代器相关操作4 vector动态增加大小并不是在原空间之后续接新空间,而是重新开辟一块2倍大的空间(原大小为0开辟1),而...原创 2020-04-02 11:40:06 · 99 阅读 · 0 评论 -
C++STL insert_iterator(插入迭代器)、ostream迭代器的重载
今天看侯老的STL源码剖析看到insert_iterator这一块突然发现一个细节上图用inserter适配器来当copy函数的第三参数,我们知道copy的第三参数需要是一个迭代器,那么我们很自然的能够想到inserter应该是返回的一个insert_iterator类型的对象。如图,确实是这样的,返回的是一个insert_iterator类型临时对象。然后我们看图上copy的源码,发现对...原创 2020-03-14 16:14:23 · 509 阅读 · 0 评论 -
c++中的 trivial destructor
如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。如果某个类中只有基本类型的话是没有必要调用析构函数的,delelte p的时候基本不会产生析构代码。在C++的类中如果只有基本的数...转载 2020-03-02 01:53:14 · 227 阅读 · 0 评论 -
STL源码第二章 allocator
1.自己定义一个allocator空间配置器#ifndef PCH_H#define PCH_H#include<new.h>#include<new>#include<cstddef> //for ptrdiff_t,size_t#include<cstdlib> //for exit()#include<climits>...原创 2020-03-01 23:01:42 · 134 阅读 · 0 评论 -
STL源码第一章
没什么好说的,Primer里边都有原创 2020-03-01 19:39:24 · 85 阅读 · 0 评论