
C++学习记录
文章平均质量分 69
Pumpkin_O
这个作者很懒,什么都没留下…
展开
-
【由二叉树的中序序列和前序序列(后序序列)重建二叉树】
由于前序遍历是根左右的顺序,可以由前序序列确定根结点的值,再在中序序列中确定根结点的位置,为什么要确定根结点位置呢,因为中序遍历是左根右的顺序,根结点即为左右子树的分界点,而后对左子树和右子树进行同样的操作,这就是一个递归的过程。假设条件:遍历序列中无重复元素。假设条件:遍历序列中无重复元素。原创 2024-08-14 14:24:00 · 466 阅读 · 0 评论 -
【数据结构的——红黑树】
红黑树是一种自平衡的二叉查找树,是一种高效的查找树,可以在Olog2n时间内完成查找、增加和删除等操作。有了二叉搜索树,为什么需要平衡二叉树?对于二叉搜索树,如果插入的数据是随机的,那么它就是接近平衡的二叉树,平衡二叉树(AVLTree)的操作效率较高,查增删的时间复杂度都是Olog2n。但是当插入的数据有序时,二叉搜索树的结点就会只在根结点的一侧,就变成了一个链表,操作效率也因此变低,时间复杂度变为了O(n)。原创 2024-08-08 11:47:39 · 1629 阅读 · 1 评论 -
【C++11新特性】
long long 整型有两种:long long和unsigned long long。在C++11中,标准要求以long long整型可以在不同平台上有不同的长度,但至少有64位。我们在写常数字面量时,可以使用LL后缀(或是ll)表示一个long long 类型的字面量,而ULL(或是ull、Ull、uLL)则表示一个unsigned long long 类型的字面量。原创 2024-07-25 18:13:39 · 1153 阅读 · 0 评论 -
【C++中线程学习】
C++11之前没有引入线程的概念,如果想要实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthead.h>,或者windows下的<windows.h>。C++11提供了语言层面上的多线程,包含在头文件<thread.h>中,解决了跨平台的问题,提供了。C++11新标准中引入了5个头文件来支持多线程编程。原创 2024-07-24 21:33:26 · 1217 阅读 · 0 评论 -
【数据结构--排序】
就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。为了查找方便,通常希望计算机中的表是按关键字有序的。排序的确切定义如下:输入:n个记录R1R2RnR1R2...Rn,对应的关键字为K1K2KnK1K2...Kn。输出:输入序列的一个重排R1′R2′Rn′R1′R2′...Rn′,使得K1′K2′K3′Kn′K1′原创 2024-07-22 16:55:05 · 940 阅读 · 0 评论 -
【数据结构--查找】
则查找成功,返回该元素在线性表中的位置,若已经查找到线性表另一端,但还没查找到符合条件的元素,则返回查找失败的信息。线性探测法可能使第i个散列地址的同义词存入第i+1个散列地址,这样本应存入第i+1个散列地址的元素就争夺第i+2个散列地址的元素的地址,从而造成大量元素在相邻的散列地址上堆积,大大降低了查找效率。分块查找的时间复杂度取决于块的数量以及块内元素的数量,在最坏的情况下(即目标位于最后一个块的最后一位),不仅需要查找完所有的块,也需要在最后一个块中遍历完所有的元素,因此,时间复杂度为。原创 2024-07-21 22:02:38 · 1557 阅读 · 0 评论 -
【B树、B-树、B+、B*树】
B-tree即B树,B是Balanced,平衡的意思,因为B树的原英文名称为B-tree,国内很多人将其译为B-tree,所以B树就是B-树。磁盘管理系统中的目录管理,以及数据库系统中的索引组织多数都采用B树这种数据结构。树中每个结点至多有m棵子树;若根结点不是叶子结点,则至少有两棵子树;除根之外的所有非终端结点至少有[m/2](向上取整)棵子树;原创 2024-07-15 20:27:07 · 1532 阅读 · 0 评论 -
【理解C++中的树】
有且仅有一个特定的称为根的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集合T1、T2、T3、…、Tm,其中每个集合本身又是一棵树,并且称为根节点的子树。没有后继的结点称为叶结点(或终端结点);有后继的结点称为分支结点(或非终端结点);除了根结点外,任何一个结点都有且仅有一个前驱;每个结点可以有0个或多个后继。树是一种递归的数据结构。n=0时,为空二叉树;由一个根结点和两个互不相交的被称为根的左子树和右子树组成,左子树和右子树也分别是一颗二叉树。原创 2024-07-14 22:14:40 · 1493 阅读 · 0 评论 -
【理解串】
其中,S是串名,双引号’'括起来的字符序列是串的值,a可以是字母、数字或其他字符,串中字符的个数n称为串的长度,当n=0时,称串为空串。串是一种特殊的线性表,数据元素之间呈线性关系,串的数据对象限定为字符集(中文字符、英文字符、数字字符、标点字符等)。朴素模式串匹配算法的缺点:当某些子串与模式串部分匹配时,主串的扫描指针i经常回溯,导致时间开销增加;在主串中找到与模式串相同的子串,并返回其所在主串中的位置。子串在主串中的位置:子串的首字符在主串中的位置。字符在主串中的位置:字符在串中的序号;原创 2024-07-11 21:57:52 · 892 阅读 · 0 评论 -
【数组、特殊矩阵的压缩存储】
只能用数字,字母和下划线命名,且不能用数字作为开头,注意数组名不要与其他变量名重复;数组的下标从0开始。一维数组的三种定义方式://数据类型 数组名[数组长度];//定义一个长度为10的数组,数组元素为int型//使用数组下标对数组元素进行访问//数组第一个元素的下标为0//数组最后一个元素的下标为9,对于长度为i的数组,最后一位元素的下标即为i-1注意:定义数组时,若未给定数组元素的初始值,则必须指定数组的长度,否则提示错误,因为编译时需要分配空间,数组长度未知的话,无法进行分配。原创 2024-07-11 17:03:16 · 1149 阅读 · 0 评论 -
【栈和队列】
10;//定义栈内元素的最大个数//静态数组存放栈的元素int top;//栈顶元素}SqStack;SqStack S;//声明一个顺序栈(分配空间)采用链式存储的栈被称为链栈。优点:便于多个栈共享存储空间和提高效率,且不存在满栈上溢的情况。在实现数据入栈时,需要将数据从链表的头部插入(头插);在实现数据的出栈时,需要删除链表头部的收元结点。因此,链栈就是一个只能采用头插法插入或删除数据的链表。//初始化链栈//判断链栈是否为空10;原创 2024-07-10 20:50:53 · 1304 阅读 · 0 评论 -
【线性表,线性表中的顺序表和链表】
线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。存在唯一的第一个元素;存在唯一的最后一个元素;除第一个元素外,每个元素均只有一个直接前驱;除最后一个元素外,每个元素均只有一个直接后继;【直接前驱】:指在该序列中位于其前面且紧邻的元素;【直接后继】:指在该序列中位于其后面且紧邻的元素。例如:在一个整数数组[1,5,8,10,49]中,元素8的直接前驱为5,直接后继为10。原创 2024-07-10 09:53:47 · 2665 阅读 · 0 评论 -
【数据结构和算法的概念等】
又称为哈希存储,地址会通过hash算法来运算成一个相同长度的hash值,然后存放这个hash值,而不是直接存放地址,在访问关键字的时候会通过运算解码hash值,然后再访问。用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置表示;一组值的集合以及定义于这个值集上的一组操作(如:int),原子类,结构类。用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示;数据的存储结构是指:数据及其逻辑结构在计算机中的表示。数据的逻辑结构是指:数据之间逻辑关系的整体。原创 2024-07-09 17:47:56 · 513 阅读 · 0 评论 -
【C++中resize和reserve的区别】
改变当前容器的最大容量(capacity),不会生成元素,只是确认这个容器允许放入多少对象,如果reserve(len)的值大于当前的capacity(),那么会重新分配一块能存len个元素的空间,然后把之前的vct.size()个元素通过copy construtor复制过来,销毁之前的内存。发现在进行了vct.reserve(150)之后,再将reserve()参数设置为比150小的,不发生变化,说明如果新的容量比原来的容量小,reserve()函数不会做任何事情。原创 2024-07-09 16:35:31 · 356 阅读 · 0 评论 -
【sizeof()求内存、内存对齐】
对于没有override的虚函数,基类和派生类中_vfptr指向的虚函数表中,这个虚函数的地址是一样的,而对于重写了的或者默认重写的析构函数来说,_vfptr指向的虚函数表,函数地址是不一样的(当然两个类的虚表指针指向的地址也是不一样的)。因为sizeof(char) = 1,sizeof(double) = 8,按照最长的字节数来进行存储,所以1 + (7)+ 8 = 16。C++类中如果有虚函数,类内就会有一个虚表指针_vfptr,指向自己的虚函数表,vptr一般都是在类的最前面。原创 2024-07-09 09:43:56 · 938 阅读 · 0 评论 -
【时间复杂度的计算】
时间复杂度(time complexxity)是一个定性描述该算法运行时间的函数,它代表算法输入值的字符串的长度。时间复杂度常用O表述,不包括这个函数的低阶项和首项系数。时间复杂度的大小比较:算法完成工作最少需要多少基本操作叫做最优时间复杂度,是一种最乐观理想的状态;算法完成工作需要多少基本操作叫做最坏时间复杂度,是算法的一个保障;算法完成工作平均需要多少基本操作叫做平均时间复杂度,它可以均匀全面地评价一个算法的好坏。原创 2024-07-08 21:38:35 · 1074 阅读 · 0 评论 -
【理解STL】
STL是惠普实验室开发的一系列标准化组件的统称。STL的一个基本理念就是将数据和操作分离,数据由容器加以管理,操作则由可定制的算法完成,迭代器在两者之间充当“黏合剂”。容器是存储其他对象的对象,它存储的对象可以是自定义数据类型的对象,也可以是内置数据类型的对象。这些被存储的对象必须是同一种数据类型,它们归容器所有,称为容器的元素。当容器失效时,容器中的元素也会失效。容器本身包含了处理这些数据的方法。另外,容器最重要的优点就是它可以扩展自身的大小。原创 2024-07-08 16:45:19 · 1447 阅读 · 0 评论 -
【理解fork()、wait()、exec()函数】
父进程产生子进程使用fork拷贝出来一个父进程的副本,此时只拷贝了父进程的页表,两个进程都读同一块内存,当有进程写的时候使用写实拷贝机制分配内存,exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。fork从父进程返回子进程的pid,从子进程返回0。调用了wait的父进程会发生阻塞,直到有子进程状态改变,执行成功后返回0,错误返回-1。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1。原创 2024-07-05 16:55:20 · 190 阅读 · 0 评论 -
【理解进程与线程、并行与并发等】
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度会将正在运行的进程转为就绪状态,让更高优先级的进程运行;创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,然后由系统为该进程分配运行时所需的资源,最后将该进程转入就绪状态;父进程号(PPID):任何进程(除int进程)都是由另一个进程创建,该进程被称为创建进程的父进程,对应的进程号就是父进程号。原创 2024-07-05 16:43:56 · 921 阅读 · 0 评论 -
【指针数组、数组指针、函数指针、指针函数的区别】
先是一个名为fp3的指针,指向一个参数为空的函数,函数返回的是一个指针,指针指向一个大小为10的数组,数组中每一个元素都是指针,指向一个参数为空的函数,函数返回值为int型。先是一个名为fp2的指针,指向一个函数,这个函数有三个int型的参数,函数返回的是一个指针,这个指针指向一个参数为int型的函数,函数返回指为float型。先是一个名为fp1的指针,指向一个参数为int型的函数,它返回的是指针,这个指针指向一个大小为10的数组,数组中的每个元素都是一个void*指针。原创 2024-07-04 20:57:20 · 276 阅读 · 0 评论 -
【int、double、float、short、char等常见类型所占字节】
【代码】【int、double、float、short、char等常见类型所占字节】原创 2024-07-04 20:22:50 · 262 阅读 · 0 评论 -
【理解new/delete和malloc/free】
1.new运算符开辟空间成功时,返回的是对象类型的指针,类型与对象严格匹配,无需进行类型转换;它的参数是一个void指针,无返回值。如果在malloc()函数的开辟过程中遇到了无法分配请求的内存块(即开辟失败),会返回一个NULL指针,因此malloc的返回值一定要进行检查。3.使用new运算符申请空间时无需指定空间的大小,编译器会根据类型信息自行计算,而使用malloc时需要显示地指定所申请空间的大小。就是开辟一个有10个int型大小的空间,int是4个字节,所以开辟的空间就是40字节。原创 2024-07-04 20:01:48 · 463 阅读 · 0 评论 -
【运算符及其优先级】
运算符及其优先级原创 2024-07-04 17:22:59 · 134 阅读 · 0 评论 -
【理解C++中的多态】
对C++中多态的理解,涉及到虚函数、虚函数表、虚表指针、重写等原创 2024-07-03 20:39:17 · 635 阅读 · 0 评论 -
【const关键字的作用】
一、const的定义二、const使用原理1、const+全局/局部变量2、const修饰指针/引用3、const修饰函数参数4、const修饰函数返回值5、const成员函数和数据成员6、const修饰类对象二、const与宏定义的区别三、const与static的区别原创 2024-07-02 20:02:53 · 687 阅读 · 0 评论 -
【写一个在main函数执行前先运行的函数】
((constructor))这个特殊语法通常用于标记在程序执行main函数之前需要执行的初始化函数,是GNU C/C++的特色,不一定在其他编译器中得到支持。原创 2024-07-02 16:41:23 · 171 阅读 · 0 评论 -
【理解++i和i++】
先返回i,再自增1。原创 2024-07-02 16:33:10 · 184 阅读 · 0 评论 -
【理解strcpy和strlen】
因为没有指定长度,可能会导致拷贝越界,造成缓冲区溢出漏洞,安全版本是strncpy。strlen是计算字符串长度的函数,返回。从src逐字节拷贝到dest,原创 2024-07-02 16:23:14 · 218 阅读 · 0 评论 -
【C++中的四种cast转换和隐式类型转换】
C++中的四种cast转换分别是const_cast、static_cast、dynamic_cast和reinterpret_cast。原创 2024-07-02 16:11:55 · 291 阅读 · 0 评论 -
【函数指针】
函数指针的定义和用途原创 2024-07-02 15:42:29 · 218 阅读 · 0 评论 -
【继承超详细理解】
继承(inheritance)机制是面向对象程序设计中可以使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。通过继承产生的新类就叫做派生类(或者子类),被继承的类叫做基类(或者父类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。注意:继承是类设计层次的复用!原创 2024-07-02 15:20:02 · 1438 阅读 · 0 评论 -
【虚函数、静态函数、析构函数】
而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存,因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。析构函数是面向对象编程中的一个概念,是一种特殊的成员函数,它没有参数,不返回任何值,也没有返回类型,用于在对象生命周期结束时执行清理工作和资源释放操作,在对象销毁时自动被调用,避免内存泄漏和资源泄露的问题。将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类时,使用基类指针指向这个子类对象时,释放基类指针时可以释放掉子类的空间,防止内存泄漏。原创 2024-07-01 21:48:09 · 569 阅读 · 0 评论 -
【static关键字的作用】
static关键字的作用原创 2024-07-01 19:06:37 · 320 阅读 · 0 评论 -
【C++中的引用和指针】
理解C++中的指针和引用原创 2024-06-28 14:10:07 · 163 阅读 · 0 评论 -
【数组和指针的区别】
数组、指针区别原创 2024-06-28 13:52:13 · 115 阅读 · 0 评论 -
【判断一个数为2的倍数、求一个数里有几个1】
2是用a和0x0001(十六进制表示,对应二进制为0000 0000 0000 0001)相与,按位进行与运算,当两个二进制位都为1时,结果为1;对于0×0001来说,只有最低位为1,其他位都是0,如果a & 0×0001 == 0;则说明a的最低位为0,是个偶数,是2的倍数。while(x)的循环条件是,当x等于0时就跳出循环,返回计数值。#1是判断a除以2后的余数是否为0,为0则说明是2的倍数;思路:逐位除以10取余进行判断。原创 2024-06-28 13:40:32 · 170 阅读 · 0 评论 -
【C++中的四个智能指针:auto_ptr, unique_ptr, shared_ptr, weak_ptr】
C++中四个智能指针的学习原创 2024-06-27 21:17:32 · 1228 阅读 · 0 评论 -
【判断一点P是否在三角形ABC内部】
思路:运用面积法,若点P在三角形ABC内部,则SABC = SAPC + SABP +SBCP。原创 2024-06-27 11:08:56 · 229 阅读 · 0 评论