随笔分类 - C/C++
摘要:什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。 RAII又叫做资源分配即初始化,即:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资
阅读全文
摘要:大家都知道如下代码中,被const限定的a是不可以被直接修改的 void main() { const int a = 3; a=1; } 在C++中const修饰的常量,不能被直接修改,但是可以通过指针进行间接修改 来看下面的例子: 运行后输出 5 3 单步执行,利用内存窗口进行查看,未修改前a为
阅读全文
摘要:红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。 通过对任何一条从根到叶子节点简单路径上的颜色来约束树的高度,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。 红黑树是满足下面红黑性质的二叉搜索树: 1. 每个节点,不是红色就是黑色的 2.
阅读全文
摘要:AVL树是高度平衡的二叉搜索树,按照二叉搜索树(Binary Search Tree)的性质,AVL首先要满足: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 AVL树的性质:
阅读全文
摘要:用例: 将一组数据从大到小进行排列 10, 16, 18, 12, 11, 13, 15, 17, 14, 19 size=10 步骤1.根据数组初始化堆中的数据(无序堆) 步骤2.从最后一个根节点( 下标为(size-1-1)/2 )开始往第一个根节点遍历,依次将每个最小子树排好序,建造一个小堆:
阅读全文
摘要:语句格式: for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:赋值表达式,用来给控制变量赋初值。(只执行一次) 表达式2:逻辑表达式,是循环的控制条件,用来判断控制变量是否符合循环条件,是则进入循环体,否则跳出循环。 表达式3:赋值表达式,用来对控制变量进行增量或减量操作。 for循
阅读全文
摘要:函数原型: 头文件: 引入: 字符串由'\0'结尾,所以字符串内部不能包含任何'\0'字符('\0'的ASCII值为0),否则我们将读不到'\0'后的字符内容。但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据。所以,我们要引入内存操作的函数来处理。 memcpy m
阅读全文
摘要:这些常用的字符串操作函数都是包在string.h头文件中。 分享此图,方便大家记忆 <(^-^)> 选中图片点击右键,在新标签页中打开图片会更清晰
阅读全文
摘要:代码段(.text),也称文本段(Text Segment),存放着程序的机器码和只读数据,可执行指令就是从这里取得的。如果可能,系统会安排好相同程序的多个运行实体共享这些实例代码。这个段在内存中一般被标记为只读,任何对该区的写操作都会导致段错误(Segmentation Fault)。 数据段,包
阅读全文
摘要:设一个N*N的方阵A,A中任意元素A[i][j],当且仅当A[i][j] == A[j][i](0 <= i <= N-1 && 0 <= j <= N-1),则矩阵A是对称矩阵。 以矩阵的对角线为分隔,分为上三角和下三角。 如上图,对称矩阵压缩存储存储时只需要存储上三角/下三角的数据,一般情况下用
阅读全文
摘要:迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路。 文件如图: 每个坐标的位置用结构体来记录: 定义行列范围: 初始化迷宫数组:将通过读文件的方式获取的字符转成整型数据,保存在M行N列的数组中。 回溯查找通路: 利用栈来存储通路,通过上下左右四个方向依次遍历,如果该位置满足条件,就
阅读全文
摘要:斐波那契数列:1,1,2,3,5,8,13,21……这个数列从第三项开始,每一项都等于前两项之和。 如果设F(n)为该数列的第n项(n∈N+)。那么菲波那切数列可以概括成如下形式: 简单的递归写法: 非递归循环方法: 这个方法只设置了三个变量,依次循环替换将结果放到数组的第三个变量中。这种方法虽然可
阅读全文
摘要:今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。 如果犯了和我一样的错,也能知道自己错在哪里! <(^-^)> 函数如下:(斐波那契数列的实现) 上面的程序有BUG,如果传给函数的参数是0,程序就会因为触发一个断点而崩溃。 单步调试,根据内存窗口就会发现问题所在!
阅读全文
摘要:本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理。 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了 浅拷贝容易出现指针悬挂的问题,深拷贝效率低,但是我们可以应用引用计数来解决浅拷贝中多次析构的问题,写时拷贝也就应运而生了。 首先要清楚写时拷贝是
阅读全文
摘要:深拷贝的现代写法相比传统写法更加简单。也就是建立一个中间对象tmp,它的_str指针指向的内容是s._str的一份拷贝,交换tmp._str和_str后,_str就指向了s._str那份拷贝,出了作用域tmp会自动调用它的析构函数,也就把原先_str指向的内存释放了,同样达到了我们要的效果。 如下图
阅读全文
摘要:浅拷贝会造成指针悬挂的问题。 举个例子:两个对象是s1和s2的指针_str都指向new开辟的同一块空间,如下图,主程序结束时,对象逐个撤销,先撤销对象s2,会调用析构函数释放动态分配的内存;再撤销对象s1时,s1._str所指向的内存空间已经是无法访问了,而s2._str原先指向的那块内存却无法释放
阅读全文
摘要:这里建立两个类,一个节点类和一个List类,与单链表不同的是双向链表的节点要多一个前驱指针,相应的,双向链表函数实现要与单链表实现有所差异
阅读全文
摘要:单链表的结构有多种 这里介绍的链表有头结点、有尾节点并且尾节点指向头结点 单链表的每个结点的地址存放在其直接前驱结点的指针域中。其中第一个结点没有前驱结点,因此需要一个头指针指向第一个节点,便于我们对整个链表进行操作;这里的单链表的最后一个节点的指针域存放的是头结点的地址。 单链表不能随意存取,必要
阅读全文
摘要:顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的。只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址。因此,线性表中的任何一个元素, 本文利用C++语
阅读全文
摘要:功能:实现日期的简单操作
基本的成员函数:构造函数,拷贝构造函数,析构函数,赋值运算符重载,操作符重载(两个日期间比较大小)
日期类功能函数: 1:计算一个日期加上多少天数后的日期 2:把该日期改为加上指定数目的天数后的日期
3:一个日期减上多少天数后的日期 4:把该日期改为减去指定数目的天数后的日期 5:该日期加1(前置++)(后置++)
6:该日期减1(前置--)(后置--) 7:计算某日期到未来某日期间隔的天数 By :Lynn-Zhang
阅读全文