- 博客(12)
- 收藏
- 关注
原创 基类指针delete派生类数组(VC++实现原理)
class A{public: A() { } //default A::destructorprivate: ... //members};class B : public A{public: B(){} //default B::destructorprivate: ... //members};有如上类定义A B,则delete A指针接收的B数组行为是未定义的: A* a = new B[2]; delete [.
2022-02-25 14:44:14
729
原创 STL容器解析之deque
vector我们可以理解为单向开口的线性空间,因为在只有在vector的尾端进行插入、删除操作才能在常数时间中完成。而deque我们可以理解为双向开口的线性空间,在deque的头部与尾部进行插入、删除操作都为常数时间复杂度。deque与vector还有一大差异,就是deque没有所谓的“容量”概念,它并没有像vector一样,划定空间的头部尾部界限,也不会发生因空间不足导致的大搬家的状况,所以de
2022-02-25 13:57:37
197
原创 STL容器解析之List
List容器是STL最基础也是最常用的两大容器之一。相比于vector来说,List在设计上与其有巨大差异,首先是内部结构,List在其内部维护一个环形链表的头节点(在概念上并不属于链表中的一节);其次是迭代器设计,List的迭代器实现在链表中的移动操作,也就是递增时上一个节点、递减时指向下一个节点,而不是单纯的指针值(地址)的加减;还有List以链表节点存储元素的单元,而不是数组,这也导致了List
2016-12-11 18:18:33
266
原创 STL容器解析之Vector
vector容器可以说是STL最基本的容器,其实现也可以说是最简单的,但是vector同时也是使用频率最高的STL容器。其实现的动态数组的效果可以广泛的应用在各个层面。对于传统的数组(array),我们常常不得不因为无法知晓在运行期确定的元素个数而为其配置一个大块头,造成了严重的内存浪费。vector相比于传统数组的改进之处在于vector的空间可以自行扩展,且这种可以自行随着元素的加入,在内
2016-12-08 18:48:29
396
原创 Traits编程技法之iterator_traits
在设计容器时,避免不了的就是设计与之契合的迭代器。迭代器,行为类似指针,担任访问元素、提领元素的重任。为什么说是重任呢?因为访问、提领虽是简单易实现的操作,但也是使用频率最高的两个操作。使用频率高,即意味着任何对性能有着极大的影响,所以我们要对迭代器的类别进行细致的划分,力求将每一种迭代器的性能都发挥到极限。(例如vector的迭代器为原生指针,原生指针可以实现随机存取(Random Acce
2016-12-06 18:52:06
353
原创 STL空间配置策略之第一级配置器__malloc_alloc_template
SGI STL中并没有使用传统的allocator作为空间配置工具,虽然allocator符合STL对于空间配置器的基本要求,但是allocator实质上只是对C++内置的::operator new和::operator delete做了一层包装: template inline T * allocate(ptrdiff_t size, T *) { set_new_handler(
2016-12-04 18:57:12
1469
原创 Traits编程技法之type_trait
STL对于性能的要求非常的严格,任何一点无意义的操作都会严重影响其中容器或算法的性能,即使只是一条语句。在高频率的使用下,这种浪费将会无限扩大。type_traits的作用之一就是提高性能。当我们在进行对象的析构(destroy)操作时,如果对象为内置对象(如int,char,float,pointer)或其数据成员包含内置对象,因为其析构操作由编译器内置执行,所以我们对其进行析构函数的调用是
2016-12-03 19:08:19
2273
1
原创 AVL树的插入与删除操作
AVL树是一种较老的数据结构,它的出现是为了解决了二叉查找树在最坏情况下的插入结果。二叉查找树(以下称为二叉树)如果能以较好的插入序列来创建,使得树的结构趋于平衡,则其大部分操作都可以O(logN)的复杂度实现。但如果以类似{1,2,3,4,5,6,.....}这种已序序列来进行插入,那么形成的二叉树将是极不平衡的,甚至有可能只有左子树或只有右子树,这样的二叉树与链表是没有太大区别的,各种操作
2016-07-22 20:30:19
4399
8
原创 二叉查找树查找指定排名元素的算法
问题如下:1.查找在二叉查找树中按大小排名为k的节点(如果元素x排名为k,则有k个元素排在x的前面,排名以0为起点),以升序排序 2.给出指定键值,返回其在二叉查找树中的排名,升序排序第1个问题分析:1.任意节点的左子树中的所有节点一定排在自身前面 2.如果左子树中节点不足,比如查找排名为6的节点,但左子树中只有3个节点,则在右子
2016-07-21 17:48:14
2994
原创 二叉查找树的向上取整/向下取整查找
此算法于《算法》P257有描述 所谓向上取整就是指大于等于x的最小整数,向下取整是指小于等于x的最大整数此算法在二叉查找树中查找大于等于x的最小整数/小于等于x的最大整数 算法主要分为几种情况讨论(以向上取整为例):1.当前节点的键值小于x:目标肯定位于当前节点的左子树,因为右子树>当前节点>目标节点,所以不可能在右子树2.当前节点的键值大于x:目标肯定位于...
2016-07-21 17:40:43
3906
3
原创 二叉查找树的层序遍历
二查找树层序遍历的思路是沿着树中同一深度的节点进行遍历难点在于如何在同层节点之间移动,一般方法为预先处理,即在处理父节点时将子节点信息保存,而且要注意需要从左向右顺序遍历,很自然的使用FIFO的队列就可以啦~由于我们在处理当前层时预先将下一层的节点入列,那我们如何知道什么时候处理完当前层了呢?我们可以在每次处理完当前层时放置一个结束的标识,因为队列节点的键值为TreeNode *,所以
2016-07-21 16:42:31
1030
原创 证明二叉查找树所有节点的平均深度
数据结构与算法分析(c语言描述)第4章 P78概念一:一棵树所有节点的深度和成为内部路径长令D(N)为一棵有N节点的树的内部路径长么,即有D(1)=0,设一棵树的左子树的内部路径长为D(i),则右子树的内部路径长为D(N-i-1)(右子树节点个数=N-左子树节点个数-根节点)综上:D(N)=D(i)+D(N-I-1)+N-1 (在原树内,左子树与右子树所有节点的
2016-07-21 11:22:58
4613
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人