【C++】C/C++内存管理 new的原理1.调用operator new函数申请空间2.在申请的空间上执行构造函数,完成对象的构造delete的原理1.在空间上执行析构函数,完成对象中资源的清理工作2.调用operator delete 函数释放对象的空间new T[ N ]的原理1.调用operator new[ ]函数, 在operator new[ ]中实际调用operator new函数完成N个对象空间的申请2.在申请空间上执行N次构造函数delete T[ N ]的原理。
【C++】类和对象【中】 4.编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝5.拷贝构造函数典型调用场景使用已存在对象创建新对象函数参数类型为类类型对象函数返回值类型为类类型对象自定义类型传值传参必须要调用拷贝构造,如果不调用就会发生浅拷贝问题【析构函数被多次调用,一块儿空间被多次释放,这是不允许的】
【数据结构】二叉树 跟的子节点为第二层,以此类推树的高度或深度:树中节点的最大层次;上面这棵树的高度是4堂兄弟节点:双亲在同一层的节点互为堂兄弟;J、K是堂兄弟节点节点的祖先:从根到该节点所经分支上的所有节点;A是E的祖先子孙:以某节点为根的自述中任一节点都称为该节点的子孙;I、J、P、Q都是E的子孙。
【C++】类和对象(上) /类体:由成员函数和成员变量组成//一定要注意后面的分号class为定义类的关键字,className为类的名字,{ }为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数类的两种定义方式:1.声明和定义全部放到类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理public:i < top;int* a;
【C++】C++入门 使用namespace关键字namespace 名字//....int main()return 0;输出:命名空间可以嵌套命名空间一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
【数据结构】双向链表 带头双向循环链表:结构最复杂,一般用在单独存储数据,实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然复杂,但是使用代码实现以后会发现这个结构会带来很多优势,实现反而简单。无头单向非循环链表:结构简单,一般不会单独用来存储数据,实际中更多是作为其他数据结构的子结构。双向链表的实现看起来复杂,实际上比单链表更加好用。
【数据结构】栈和队列 栈:一种特殊的线性表,只允许再固定的一端进行插入和删除操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据遵循先进后出的原则压栈:栈插入操作叫做进栈/压栈/入栈。入数据在栈顶出栈:栈的删除操作叫做出栈。出数据也在栈顶。
【数据结构】单链表 为什么要学习链表?前面我们所学习的顺序表是存在缺陷的顺序表的缺陷:1.空间不够用就需要扩容,扩容可能会是异地扩容,并且扩容是会发生代价的,可能会造成空间的浪费2.头部或者中间部分的删除,需要大量的移动数据,效率低下优化方案:1.按需申请空间2.尽可能少的移动数据,或者是不移动数据。
【leetcode】20.有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。遇到左括号进栈,遇到右括号就出栈,看是否匹配。每个右括号都有一个对应的相同类型的左括号。左括号必须用相同类型的右括号闭合。输入:s = "()[]{}"左括号必须以正确的顺序闭合。输入:s = "()"输入:s = "(]"
【数据结构】栈 一般可以使用数组或者链表来实现,但是相对而言数组的结构更加方便一些,数组在进行尾插数据时更加方便,栈的特点时先进后出,一般来说不会在头删、头插、中间的插入和删除,多数情况都在栈顶进行数据的插入(尾插),所以。如果想要在主函数中打印出栈中元素个数,我们就需要关心top初始化为哪种情况,而单独分装一个函数,直接在主函数中调用即可。这里的StackSize接口函数中只有两行代码,为什么需要单独分装一个函数,为什么不在主函数中计算元素的个数?栈:一种特殊的线性表,只允许在固定的一端进行插入和删除的操作,
【leetcode】88.合并两个有序数组 为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。注意合并后的数组不是由函数返回而是存储再nums1中,所以思路2的方法不可行,并且题目中给了nums数组的长度是m+n。两个数组中的内容进行比较,取小的放到新数组中,当一个数组走完了,将另一个数组剩下的内容放到新数组中即可。情况2:nums1中数据先走完,nums2中的数据还没走完,num2中的数据还要继续拷贝到nums1中。情况1:i2中数据先结束,剩下的数据就不需要动了。
【leetcode】26.删除有序数组中的重复项 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。将最终结果插入 nums 的前 k 个位置后返回 k。的思想,与上一个leetcode中思想一致。
【leetcode】27.移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
【数据结构】顺序表 【本篇内容】线性表顺序表线性表是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表、链表、栈、队列、字符串......线性表在逻辑上是线性结构,但是在物理结构上并一定是连续的,线性表在物理上存储时,通常是以数组和链式结构的形式存储的。
【数据结构】算法时间复杂度和空间复杂度 衡量一个算法的好坏一般是从时间和空间上来衡量的,即时间复杂度和空间复杂度,时间复杂度是衡量一个算法的运行快慢,而空间复杂度主要是衡量一个算法所需要的额外的空间,当前计算机的存储容量已经达到了很高的程度,所以我们一般不再关注一个算法的空间复杂度,算法的时间复杂度是一个函数(数学中的函数)定量的描述算法的运行时间,一个算法所耗费的时间与其中语句执行的次数成正比例,第一个for循环执行N次,第二个for循环执行M次,计算出的时间复杂度应该是N+M,算法中的基本操作的执行次数为算法的时间复杂度。