
C/C++
luanzheng_365
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++模板实现稀疏表
注意:1.使用模板时,vs2015有时候也会识别不出来导致没有提示.这种情况下要相信自己,并非语法错误.尝试编译链接通过,应该就不是语法错误.2.我只定义了2个模板参数,却一直报error C2977,模板参数太多的错误.检查后发现,原来是在另一个文件中定义了同样的结构,而那个文件中只有一个模板参数. 将结构名称更改后,问题消息.奇怪为什么没有include文件,却会导致冲突发生?原创 2017-03-15 23:06:44 · 424 阅读 · 0 评论 -
C++模板实现希尔排序
希尔排序是一种高效的排序算法,原理是将大数组分成若干个小数组,对每个小数组进行排序.之后缩短步长,对原数组重新划分小组,继续对每个小组进行排序.直到步长变为1后,进行最后一次直接插入排序. 此算法高效的原因在于直接插入排序在对基本有序的序列进行排序是十分高效的.前期划分子数组进行排序,可以逐渐使得较大的元素排列在原序列的尾部,符合插入排序高效的前提条件.步长的经验值以如下公式得出: h1 = 1原创 2017-04-22 08:41:21 · 499 阅读 · 0 评论 -
C++模板实现堆排序
堆的概念我在之前的文章中已经有说明,这里不再赘述.本小结的内容仅包括堆排序部分.算法特点: 1.不稳定. 2.时间复杂度 O(nlog(n)) 3.空间复杂度 O(nlog(n))在堆删除节点的同时,正好可以巧妙的将该数据放置到数组被删掉的位置,最后得到排序好的数组(堆的根节点被弹出后,总是将最后节点重新放置到跟节点,这样,最后节点位置正好空出).//Heapsort//1. Not Sta原创 2017-04-22 21:34:49 · 488 阅读 · 0 评论 -
C++模板实现快速排序
快速排序是一种效率很高的排序算法,其基本思想是首先选取第一个位置做为哨兵,从最后位置开始依次向前搜索,搜索到第一个小于哨兵的元素,则进行位置交换,之后在从开始位置开始进行搜索,搜索到第一个大于哨兵的元素,则进行位置交换,如此往复,直到整个序列被遍历一遍,则完成一次快速排序.结果是,哨兵左边的元素都小于哨兵,哨兵右边的元素都大于哨兵.之后,使用分治法,对左右两个子序列再进行快速排序,最终达到整个序列的原创 2017-04-23 12:36:21 · 1525 阅读 · 0 评论 -
C++实现基数排序
基数排序的思想是先将要排序的序列进行划分,分成几个桶.(比如说,整数可以按照0-9分成10个桶,单词可以按照a-z分成26个桶). 从元素的最低位开始,一轮循环下来,根据元素的最低位进行一轮的分桶排序.下一轮循环则考察元素的次低位,依次类推,直到完成.基数排序需要借助队列来做额外的辅助存储空间.利用队列的先进先出的性质,使用队列来做为容器,分成几个桶,就有几个队列.每个元素根据当前考察位进入相应的队原创 2017-05-15 10:52:29 · 779 阅读 · 0 评论 -
C++模板实现归并排序
归并排序的思想是将一个大的序列先进行二分法划分,直到划分到每个子序列只包含一个元素为止. 然后对序列进行依次合并,在合并的过程中实现排序.归并排序是一种典型的外部排序算法,需要额外的辅助空间来完成算法.算法分析: 1.稳定 2.时间复杂度: O(nlog(n)) 3.需要额外辅助空间来实现排序//Mergesort//1. Stable//2. Time complex O(nlog(n)原创 2017-04-25 12:38:40 · 575 阅读 · 0 评论 -
C++实现计数排序
计数排序首先利用数组计数器count[]对每个数字在数组data[]中出现的次数进行计数.然后,计数器将所有<=i的整数的个数添加并存储到count[i]中.通过这种办法,count[i]-1表明i在data[]中的主位置.时间复杂度: 4*max value 空间复杂度: O(n),需要额外计数器存储与额外最终排序空间存储,即不是在原有数组上进行排序. 算法稳定性: 稳定补充强化C++基础,c原创 2017-06-25 10:20:41 · 419 阅读 · 0 评论 -
基于KMP算法的C++字符串帮助类
利用C++实现的字符串基本查找替换算法类.基于KMP算法. 本文只给出最初版本,后续将进行持续优化,目的是提高算法效率,目标是达到或超过C++标准库中的方法的效率.原创 2017-07-08 11:20:17 · 302 阅读 · 0 评论 -
Effective C++读书笔记(十一)继承与面向对象设计部分(下)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item36 绝不重新定义继承来的non-virtual函数non-virtual函数都是静态绑定的。这意思是说,由于pB被声明为一个point-to-B,通过pB调用的non-virtual函数永远是B所定义的版本,即使pB指向一个类型为...原创 2018-03-15 11:19:35 · 319 阅读 · 0 评论 -
Effective C++读书笔记(一)导读部分
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。0 导读 将构造函数声明为explicit,可组织它们被用来执行隐式类型转换。常常更受欢迎,因为它们禁止编译器执行非预期的类型转换。#ifndef _A_H_#define _A_H_class A{public: ...原创 2018-03-01 17:34:16 · 220 阅读 · 0 评论 -
Effective C++读书笔记(二)让自己习惯C++部分
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item 1.视C++为一个语言联邦 当使用C++以下4种情况时,对应的高效准则可能不同。 1) C 2) Object C 3) template 4) STLItem 2. 尽量以const,enum,inline替换#def...原创 2018-03-01 17:41:51 · 285 阅读 · 1 评论 -
Effective C++读书笔记(三)构造,析构,赋值运算部分(上)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item5 了解C++默默编写并调用哪些函数重点内容 默认构造函数 默认析构函数 拷贝构造函数 拷贝赋值操作符若自己声明了一个构造函数,则编译器不会自动生成默认构造函数。 对于内置类型,会以拷贝每一个bits来完成初始化,而对于非...原创 2018-03-14 09:46:54 · 189 阅读 · 0 评论 -
Effective C++读书笔记(四)构造,析构,赋值运算部分(下)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item9 绝不在构造和析构函数中调用virtual函数Base class构造函数的执行更早于derived class构造函数,因此,base class构造期间virtual函数绝不会下降到derived class阶层。或者说,在b...原创 2018-03-14 09:55:10 · 208 阅读 · 0 评论 -
Effective C++读书笔记(五)资源管理部分
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item13: 以对象管理资源先看一下下面的例子:void f(){ Investment* pInv = createInvestment(); ... delete pInv;}如果…语句里面产生...原创 2018-03-14 15:35:59 · 168 阅读 · 0 评论 -
Effective C++读书笔记(六)设计与声明部分(上)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item18: 让接口容易被正确使用,不易被误用理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译;如果代码通过了编译,他的作为就该是客户所想要的。明智而审慎的导入新类型。 例:#ifndef _...原创 2018-03-14 15:39:44 · 163 阅读 · 0 评论 -
Effective C++读书笔记(七)设计与声明部分(下)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item22 将成员变量声明为private如果public接口内的每样东西都是函数,客户就不需要在打算访问class成员时迷惑地试着记住是否该使用小括号。细微的划分访问控制破有必要,因为许多成员变量应该被隐藏起来。如果你通过函数访...原创 2018-03-14 15:42:42 · 216 阅读 · 0 评论 -
Effective C++读书笔记(八)实现部分(上)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。条款26 尽可能延后变量定义式的出现时间延后变量定义式的出现时间,直到确实需要它。万一在后续运行过程中,出现异常,该变量可能并没有实际使用,因此延后定义可以节省构造成本和析构成本。甚至应该尝试延后这份定义直到能够给它初值实参为止。如果这...原创 2018-03-14 15:45:59 · 197 阅读 · 0 评论 -
Effective C++读书笔记(九)实现部分(下)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item29 为“异常安全”而努力是值得的“异常安全”有两个条件 1)不泄露任何资源。 2)不允许数据败坏。例如下列代码:void PrettyMenu::changeBackground(std::istream&...原创 2018-03-14 15:48:20 · 228 阅读 · 0 评论 -
C++模板实现梳排序
梳排序是一种改进的冒泡排序算法,通过比较元素彼此之间的步长位置这种方式先对数据进行预处理,在每次移动中,步长会越来越小,直至他等于1.这一理念就是在正式排序前先将一些大元素移动至数组的底部.之后正式排序采用冒泡排序算法来进行.原创 2017-04-20 20:52:30 · 432 阅读 · 0 评论 -
C++模板实现二叉树(七 AVL树的删除)
AVL树的删除比插入更加耗时与复杂,主要表现在使用复制删除删除掉某个节点后,经过旋转,重新平衡之后,子树的高度可能发生变化,因此需要继续向上追溯,对父节点重新评估是否需要做重新平衡。是否需要平衡的原则是看balance value,只要出现+2或者-2就需要旋转与重新平衡。是否向上追溯取决于子树的高度是否减少,只要子树高度降低,就需要向上追溯。情况一: 不旋转,不追溯。 情况二:不旋转,向上追溯。原创 2017-04-16 17:35:39 · 598 阅读 · 0 评论 -
C++利用链表与模板实现栈
栈是一种十分常见的后进先出的数据结构.本文使用C++, 模板, 链表来自己实现一个最基本的栈.原创 2017-03-19 09:42:07 · 678 阅读 · 0 评论 -
C++模板实现二叉查找树(一 树的数据结构定义与节点插入)
树是一种基本的数据结构.二叉查找树以其高效的搜索效率而被在大数据搜索中广泛应用.本系列文章旨在建立二叉查找树,并实现其基本方法.其中,每一个数的节点用以下数据结构定义,每个节点都包括data域,左指针和右指针.template <class T>class BinNode{public: BinNode(); BinNode(const T& data, BinNode<T>原创 2017-03-27 22:33:04 · 433 阅读 · 0 评论 -
C++模板实现链表
单链表是一种非常基本的数据结构. 虽然C++ STL中已经存在功能强大的List,但我们通过自己实现单链表,对于锻炼C++的基本功,加深对编程的理解与认识还是很有益的. 另外,自己的代码,在使用过程中更容易和敢于修改,更容易灵活定制自己的需求. 在实现单链表的过程中,选用模板,可以使得链表得到极大的灵活性.代码的可复用性大大增强. 核心代码分析解读: 1. 定义存放单个节点的数据结构: T可以原创 2017-03-19 09:51:34 · 589 阅读 · 0 评论 -
C++模板实现链表队列
队列是一种十分常见的数据结构,具有先进先出的特点.队列在处理消息时,非常常用.本文利用C++,模板,链表来实现一个简单的队列.原创 2017-03-21 21:18:22 · 2035 阅读 · 0 评论 -
C++模板实现二叉查找树(二 节点删除)
接着上一篇内容,继续实现二叉树节点的删除。结点的删除主要有两种方法,合并删除与复制删除。 合并删除的思想是先找到要删除的节点,如果要删除的节点同时有左右子树,则将左(或右)子树挂在要删除的节点的位置,之后将右(或左)子树挂在原来左(或右)子树的最右(或左)节点的右(或左)子树位置。复制删除的思想是先找到要删除的节点,如果要删除的节点同时有左右子树,则进入到其左(或右)子树的最右(或左)节点,将该节原创 2017-03-29 22:01:52 · 328 阅读 · 0 评论 -
C++模板实现二叉树(六 AVL树基础与旋转)
dsw算法可以从全局平衡树,但是,往往在插入于删除动作发生时,将只影响树的一部分,此时重新平衡可以只在树的一部分进行.AVL树要求每个节点左右子树的高度差最大为1.平衡因子用右子树的高度减去左子树的高度.在AVL树中,平衡因子应该只有-1,0,1三种选择.只要AVL树中任意一个节点的平衡因子小于-1或者大于1,树就要失去平衡.原创 2017-04-09 10:22:02 · 599 阅读 · 0 评论 -
C++模板实现二叉查找树(三 深度优先遍历)
二叉树的深度优先遍历有以下三种模式: 1. 先序遍历(VLR) – 此模式为先访问父节点,再访问左节点,最后访问右节点. 2. 中序遍历(LVR) – 此模式为先访问左节点,再访问父节点,最后访问右节点. 按照中序遍历方法访问二叉查找树,得到的结果是从小到大排列有序的. 3. 后序遍历(LRV) – 此模式为先访问左节点,再访问右节点,最后访问父节点.遍历的思想有两种: 递归 非递归:原创 2017-03-31 21:08:43 · 457 阅读 · 0 评论 -
C++模板实现二叉查找树(四 广度优先遍历)
二叉树的广度优先便利遵循从上之下,从左至右的原则.实现广度优先便利,利用了队列(LinkQueue<BinNode<T>*, capacity> *queueHelper;)的先进先出的性质.先将节点入队列,之后取出,访问.访问完后,将其左右子节点入队列.依次循环即可.原创 2017-04-01 09:52:41 · 389 阅读 · 1 评论 -
C++模板链表实现优先级队列
本文是承接我的上一篇文章,只是将普通队列增加了优先级.实现了一个优先级队列.本文采取的优先级队列的实现方式在于数据增加优先级标志位,在数据进入队列时,根据优先级排序的顺序进入,出队列仍然是从头出.使用该种思想实现的优先级队列.继承普通链表队列(具体参考http://blog.youkuaiyun.com/luanzheng_365/article/details/64518754). 注意需要将普通链表队列的原创 2017-03-25 11:12:52 · 1668 阅读 · 0 评论 -
C++常用正则表达式匹配
正则表达式在匹配字符串,验证输入合法性时经常用到.C++ 11标准库中已经支持了正则表达式.以下对于几个常用的验证进行实现,以体会C++正则表达式的用法.注意: 在C++中,对于特殊字符,需要使用转义字符. 因此,匹配数字的\d,需要写成\d这种格式. 经典的三部曲匹配: 1.先写pattern. string pattern = {“XXXX”}; 2.使用re. regex re(pat原创 2017-03-22 22:58:40 · 7528 阅读 · 0 评论 -
C++中的重载,覆盖,隐藏与多态
重载,覆盖,隐藏与多态是C++中面向对象设计的几大特性.深入理解这些特性,对于我们编写高效的可复用,可重用的代码有重要意义.这里,对这一部分知识加以回顾.原创 2017-04-12 21:30:44 · 433 阅读 · 0 评论 -
C++模板实现二叉树(五 树的平衡之dsw算法)
二叉树的高效查找算法依赖于树的平衡.如果树高度不平衡,二叉树将退化成类似链表的效率,则二叉树的优势就不存在了.平衡二叉树的dsw算法提供了一种将二叉树转化成平衡二叉树的方法. 算法的核心思想是利用旋转. 1.通过右旋转生成主链. 2.通过左旋转生成平衡二叉树.原创 2017-04-04 08:56:31 · 1460 阅读 · 0 评论 -
C++模板实现堆
堆是一种特殊类型的二叉树,具有以下两个性质: 1. 每个节点的值大于/小于(最大堆/最小堆)等于其每个子节点的值 2. 该数完全平衡,最后一层的叶子都处于最左侧的位置本文以最大堆为例子,实现堆的插入与删除操作.其中,堆的插入操作总是在最后的位置,删除操作总是在开头的位置.有些与队列的先进先出相似. 代码实现如下: 其中,利用数组来实现堆,数组的下标天然的可以对应堆的层次结构.若父节点下标为i原创 2017-04-17 21:25:10 · 372 阅读 · 0 评论 -
C++模板实现直接插入排序
排序是数据结构中的重要章节.涉及到多种排序算法.本小节讲述直接插入排序的算法及实现.直接插入排序的思想是,插入的元素插入到一个已经排列有序的数组中,从数组末尾开始进行比较,如果发现插入的数小于被比较的数,则两数交换位置,直到没有发生交换,算法终止.算法是稳定的,时间复杂度为O(n2),空间复杂度为O(n2),内部排序,不需要额外空间.原创 2017-04-18 21:58:00 · 575 阅读 · 0 评论 -
C++模板实现简单选择排序
简单选择排序的思想是每次选择最小的数据,放在数组(链表)的最开头位置,然后将开头位置向后移动一个单位. 外层循环负责依次设置开头位置,内层循环负责选择从开头位置到结尾位置的最小数据,之后与开头位置进行交换.原创 2017-04-19 21:21:23 · 560 阅读 · 0 评论 -
C++模板实现冒泡排序
冒泡排序的思想是从数组(链表)末尾开始,对相邻的两个数据进行比较,如果小数据在后面,则交换位置.直到进行到开头位置,则称为进行了一次冒泡.最小的数据被冒泡到了开头位置.然后将开头位置向后移动一个单位,依次进行冒泡,直到某次冒泡没有发生数据交换或者冒泡的循环完毕为止.原创 2017-04-19 21:49:32 · 1275 阅读 · 0 评论 -
Effective C++读书笔记(十)继承与面向对象设计部分(上)
读书笔记中涉及到的所有代码实例可通过https://github.com/LuanZheng/EffectiveCPlusPlus.git进行下载获得。Item32 确定你的public继承塑模出is-a关系以C++进行面向对象编程,最重要的一个原则是:public inheritance意味“is-a”的关系。适用于base class身上的任何一件事情也适用于derived class...原创 2018-03-14 15:51:30 · 273 阅读 · 0 评论