- 博客(123)
- 收藏
- 关注
原创 [C++]C++11(上)
容器之间的主要设计区别在于,前者在内部仅保留指向下一个元素的链接,而后者为每个元素保留两个链接:一个指向下一个元素,一个指向前一个元素,允许在两个方向上进行高效迭代,但每个元素会消耗额外的存储空间,并且插入和删除元素的时间开销略高。forward_list类模板在设计时就考虑到了效率:根据设计,它与简单的手写 C 样式单链表一样高效,实际上,它是唯一一个出于效率考虑而故意缺少 size 成员函数的标准容器:由于它作为链表的性质,具有需要恒定时间的大小成员将要求它为其大小保留一个内部计数器(如。
2025-04-01 15:26:39
955
原创 [C++][STL]unordered_set类和unordered_map类
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到logN,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到。在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。unordered_xxx系列与map和set容器的用法上几乎没有任何区别他们的区别就是。
2025-03-27 22:16:55
830
原创 [C++]哈希表
相比闭散列,开散列看似增加了存储指针的空间开销,实际上闭散列要保证大量的空闲单元以降低哈希冲突,所以开散列反而更加节省空间,其空间利用率更高!哈希表平均查找可达O(1),但最坏降到O(N)(哈希冲突)红黑树最坏查找也可保持O(logN),比较稳定数据有序性:哈希表无序,而红黑树有序适用场景:哈希表适合单点查找,红黑树适合范围查找。
2025-03-27 16:42:07
863
原创 速通python 第五节——列表和元组
编程中经常需要使用变量来保存表示数据如果代码中需要表示的数据个数比较少我们直接创建多个变量即可但是有的时候代码中需要表示的数据特别多甚至也不知道要表示多少个数据这个时候就需要用到列表.创建列表主要有两种方式[ ]表示一个空的列表如果需要往里面设置初始值可以直接写在[ ]当中可以直接使用 print 来打印 list 中的元素内容列表中存放的元素允许是不同的类型. (和C++ Java不同。
2024-12-22 22:02:32
847
原创 速通Python 第四节——函数
10.编程中的函数和数学中的函数有一定的相似之处. 数学上的函数, 比如 y = sin x , x 取不同的值, y 就会得到不同的结果. 编程中的函数, 是一段 可以被重复使用的代码片段求一段范围的数的和不使用函数可以发现这几组代码基本是相似的只有一点点差异可以把重复代码提取出来做成一个函数在实际开发中, 复制粘贴是一种不太好的策略. 实际开发的重复代码可能存在几十份甚至上百份.一旦这个重复代码需要被修改, 那就得改多次因此我们可以定义一个函数来解决这些问题因此上面的代码最终就是。
2024-12-22 21:37:03
1066
原创 速通Python 第二节
在Python中一个变量是什么类型是可以在程序运行过程中发生变化的这个特性称为动态类型在程序执行过程中, a的类型刚开始是int,后面变成了str.C++/Java这样的语言则不允许这样的操作一个变量定义后类型就是固定的了这种特性则称为静态类型".动态类型特性是一把双刃剑对于中小型程序可以大大的解约代码量比如写一段代码就可以同时支持多种类型).对于大型程序则提高了模块之间的交互成本. (程序猿A提供的代码难以被B理解注释是一种特殊的代码。
2024-12-21 15:22:24
927
原创 速通Python 第一节
a=10上述代码的意思就类似与把10这个数据存放在a这个空间中注意:=在Python中是"赋值运算符"不是数学上的等号变量名由数字字母下划线构成数字不能开头变量名不能和关键字重复变量名大小写不同. num和Num是两个不同的变量名2)变量的使用读取变量的值a = 10print(a)运行结果:注意:print运行结束会自带一个换行,至于怎么不换行后面解释修改变量的值a = 10print(a)a = 20print(a)p运行结果:当然。
2024-12-21 13:58:24
742
原创 [C++&数据结构]map与set的模拟实现
想要对于map和set进行模拟实现,我们首先就需要对于map和set的源码进行分析我们发现在set和map中包含有如下的头文件于是我们可以先打开这些头文件,我们先不考虑multimap与multiset我们可能会因为set只有存数据而会误以为他里面使用的是key模型的红黑树,但是其实不是的。在stl库里面map和set使用的是同一棵key-val的红黑树。如下所示,可以看出来不过虽然使用的是key-val的红黑树,但是它的key和val都是key。
2024-11-27 18:08:55
945
原创 全国高校计算机能力挑战赛区域赛2019C++选择题题解
记stack1的容量是O,stack2的容量是P,(O>P),将stack1作为存储空间,stack2作为输出的缓冲空间。如果出队列的顺序为c,f,e,g,d,b,a,则要求栈X的最小容量为()。B:有序顺序表顺序存储地址是连续的,有序的单链表地址随机的,只是数据元素是有序的,折半查找主要通过的是地址下标来查找的,因此有序单链表不能用折半查找来得到数据。38.若有定义int a[2][5],a[0][1]的地址是X,且一个整型数据占用两个字节的内存空间,则a[0][0]和a[1][3]的地址分别为()。
2024-11-16 20:32:49
1005
原创 [算法初阶]快速幂
我们先来看这道题这道题目乍一看会觉得并不难啊,题目短短一行而已,而且思路也很容易,求幂这种算法一般在初学程序设计语言的时候应该都有联系过,只要写一个简单的循环就能够搞定。(或者用pow函数)这里假设我们使用循环来写!i <= n;但是这样真的对吗?我们不妨来运行一下:奇了怪了?为什么会变成这样子呢?先不急,我们再来考虑一下,为什么这道题会让我们取模呢?仅仅只是增加难度嘛?实则不然,我们知道”指数爆炸。
2024-11-13 15:41:37
739
原创 [算法初阶]埃氏筛法与欧拉筛
首先我们明白:素数的定义是只能整除1和本身(1不是素数)。我们判断一个数n是不是素数时,可以采用试除法,即从i=2开始,一直让n去%i,直到i*i
2024-11-10 22:57:22
295
原创 [C++进阶&数据结构]红黑树
红黑树有红色结点和黑色结点两种颜色。所以不妨我们使用一个枚举类型来进行表示。红黑树里面我们需要有一个pair类型来进行存储key和value类型的数据。然后我们定义三个指针,分别指向父亲,左孩子,右孩子。最后定义其的颜色。在构造函数中,我们将其的颜色默认设置为红色。设置为红色是比较有讲究的。那是因为我们大多数场景下都是去创建一个新节点去插入的。如果我们插入的这个新结点是黑色的话,那么造成的后果就是违反了规则4,即每条路径上的黑色结点个数相同,显然这种情况要进行补救的话是十分麻烦的。
2024-10-24 23:09:44
1007
原创 [C++进阶]第三十五节 AVL树
如下所示,我们将AVL结点的值定义为一个pair对象,目的是使用key-value模型。bf是一个平衡因子。这里我们还需要使用三叉链结构int _bf;
2024-09-17 17:17:36
935
1
原创 [C++进阶&数据结构]第三十四节 map和set的相关题目
代码解析:6.单词识别代码解析:本篇类似番外,目的只是方便大家巩固,如有错误感谢指正
2024-08-30 23:54:50
1092
原创 [C++进阶]第三十二节 map和set
如下图所示:我们可以注意到它的模板参数是要比其他容器多一个的,这个容器我们也可以看到是一个仿函数。我们使用优先级队列的时候也用过这个仿函数。集合是按照特定顺序存储唯一元素的容器。在一个集合中,元素的值也标识它(值本身就是键,类型为 T),并且每个值必须是唯一的。集合中元素的值在容器中不能修改(元素总是 const 类型的),但是可以从容器中插入或删除元素。在内部,集合中的元素总是按照其内部比较对象(类型为 Compare )指示的特定严格弱排序标准排序。
2024-08-21 00:03:30
1214
原创 [C++进阶]第三十一节 二叉树进阶的一些面试题(二)
(中序和后序跟前序的思路完全一 致,只是前序先访问根还是后访问根的问题。后序稍微麻烦- -些,因为后序遍历的顺序是左子树右子树根,当取到左路结点的右子树时,需要想办法标记判断右子树是否访问过了,如果访问过了,就直接访问根,如果访问过需要先访问右子树。这里访问右子树要以循环从栈依次取出这些结点,循环子问题的思想访问左路结点的右子树。这题是上面那题的姊妹题,换换顺序就能写好了。但是这道题我们的目的是用迭代做出来。2.再访问左路结点的右子树。
2024-08-19 01:06:27
203
原创 [C++进阶]第三十节 二叉树进阶的一些面试题(一)
核心思想:我们在层序遍历过程中,增加一-个levelSize,记录每层的数据个数,树不为空的情况下,第1层levelSize=1,循环控制,第1层出完了,第2层就都进队列了,队列中size就是第2层的数据个数。这道题属于与基础题,首先我们观察输入输出样例可以得到如果root->left为空,root->right不为空时,我们的空格仍然需要保留,如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;上题我们搞完了,这题我们其实有个很简单的办法,我们把上题的代码赋值过来直接逆置即可。
2024-08-18 00:56:30
403
原创 [Linux]第七节 关于Linux版本,命令与权限的一些选择题
yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用 yum makecache将软件包信息缓存到本地,使用 yum clean all 清理老旧的缓存信息。14.你使用命令”vi/etc/inittab”查看该文件的内容,你不小心改动了一些内容,为了防止系统出为,你不想保存所修改的内容,你应该如何操作。解析: 沾滞位的作用:在设置的沾滞位的目录下,其它用户可以创建文件,但是只能删除自己的文件,不。C 在末行模式下,键入:x!
2024-08-14 19:57:21
949
原创 [算法初阶] 第一集 双指针
一、双指针概念相应大家的要求,所以我决定在开一个算法初阶的专栏,这样方便大家能够从我这的学习能够连贯。一、双指针概念常见的双指针有两种形式,⼀种是,⼀种是。:⼀般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同⼀个位置)left > right (两个指针错开)
2024-08-11 14:31:23
980
原创 [算法2] 第三集 剪枝
在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。
2024-08-11 01:07:31
1039
原创 [算法2] 第二集 二叉树中的深度搜索
一、(DFS,全称为 Depth First Traversal),是我们树或者图这样的数据结构中常⽤的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分支,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。在⼆叉树中,常见的深度优先遍历为:前序遍历、中序遍历以及后序遍历。因为树的定义本⾝就是递归定义,因此采⽤递归的方法去实现树的三种遍历不仅容易理解⽽且代码很简洁。
2024-08-09 20:36:57
1111
原创 [算法2]第一集 递归
我们再C语言和数据结构里都用了不少递归,这里就不多详细介绍。递归简单来说就是函数自己调用自己的情况二、为什么要用递归呢?本质来说其实就是我们在解决一个问题后出现相同的问题,解决这个问题后会再出现相同的问题。我们解决这些问题的方式一样,所以就出现了函数自己调用自己。
2024-08-07 22:44:41
1090
原创 [C++进阶]第二十七节 继承和多态的选择题
子类定义的虚函数的新的行为会操作a变量,在子类初始化时根据构造函数调用顺序会首先调用父类构造函数,那么虚函数回去操作a,而因为a是子类成员变量,这时a尚未初始化,这是一种危险的行为,作为一种明智的选择应该禁止这种行为。C. 选择题一定要扣字眼,题目前半句说的是基类引用 引用了子类对象,但是后半句调用虚函数时,说的是基类的对象调用f2,通过对象调用时编译期间就直接确定调用那个函数了,不会通过虚表以多态方式调用。C.A::f(),因为强制类型转化后,生成一个基类的临时对象,pa实际指向的是一个基类的临时对象。
2024-07-31 01:31:09
861
原创 [C++进阶]第二十六节 抽象类
在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。至于为什么起这个抽象的名字,我们可以理解为,这个类在现实世界中没有实体。所以不能实例化出对象。而且由于派生类继承了抽象类,它里面也包含了纯虚函数,那么它自然也不能实例化出对象了。
2024-07-29 08:42:26
412
原创 [C++进阶]第二十五节 对于多态的底层逻辑
在前面我们也已经提到过,在语法层面称之为重写,重写的是它的实现。所以有时候我们也会提出一个概念,普通的函数的继承称为实现继承,而多态,虚函数的重写,其实就是一个接口继承,然后重写它的实现在原理上就是说将父类的虚函数表给拷贝下来,然后将子类中重写的部分给覆盖。其次,因为只有完成了虚函数的重写,那派生类的虚表里面才能是派生类的虚函数。这样的话,这个基类指针才能做到指向父类调用父类,指向子类调用子类。
2024-07-29 00:00:14
1174
原创 [C++进阶]第二十四节 多态的概念、定义与实现
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。多态的实现有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写(也就是要调用重写的虚函数)。
2024-07-26 01:11:34
1023
原创 [C++进阶]第二十三节 多继承和菱形继承
很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO(OO是面向对象,OOP是面向对象程序设计)语言都没有多继承,如Java。
2024-07-23 00:25:45
781
原创 Leetcode215. 数组中的第K个最大元素
遍历数组将元素入堆;如果当前堆内元素超过 k 了,我们就把堆顶元素去除,即去除当前的最小值。因此我们在元素入堆的过程中,不断淘汰最小值,最终留在堆中就是数组中前 k 个最大元素,并且堆顶元素为前 k 大元素中的最小值,即为第 k 个元素。我们也可以使用堆排序来解决这个问题——建立一个小根堆,
2024-07-21 23:31:38
298
原创 [C++]第二十节 优先级队列
优先级队列是一种容器适配器,根据一些严格的弱排序标准,专门设计使其第一个元素始终是它所包含的元素中最大的元素。此上下文类似于堆,其中可以随时插入元素,并且只能检索最大堆元素(优先级队列中顶部的元素)。优先级队列是作为容器适配器实现的,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素是从特定容器的“背面”弹出的,该容器称为优先级队列的顶部。基础容器可以是任何标准容器类模板,也可以是其他一些专门设计的容器类。
2024-07-19 23:27:54
1192
原创 [C++初阶]第十九节 deque的讲解
Deque是双端队列的不规则缩写。双端队列是具有动态大小的序列容器,可以在两端扩展或收缩。特定的库可能以不同的方式实现deque,通常是某种形式的动态数组。在任何情况下,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩容器来自动处理存储。因此,它们提供了类似于向量的功能,但在序列的开始,而不仅仅是在序列的末尾,也可以有效地插入和删除元素。但是,与vector不同,deque不能保证将其所有元素存储在连续的存储位置:通过偏移指向另一个元素的指针来访问deque中的元素会导致未定义的行为。
2024-07-19 01:14:44
971
原创 [C++]第十八节 一些list,stack和queue选择题和编程题
这时我们学完后的应用1.下面有关vector和list的区别,描述错误的是( )A.vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机存取,应该使用vectorB.list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用listC.vector::iterator支持“+”、“+=”、“
2024-07-16 23:17:36
1022
原创 [C++]第十七节 reverse_iterator的封装实现
反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器;当反向迭代器执行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。
2024-07-16 15:01:59
238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人