自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(107)
  • 收藏
  • 关注

原创 [C++进阶]map和set的相关题目

代码解析:6.单词识别代码解析:本篇类似番外,目的只是方便大家巩固,如有错误感谢指正

2024-08-30 23:54:50 999

原创 [C++番外] 抛异常

异常总体而言,利大于弊,所以工程中我们还是鼓励使用异常的。

2024-08-27 22:54:01 1114

原创 [C++进阶]map和set

如下图所示:我们可以注意到它的模板参数是要比其他容器多一个的,这个容器我们也可以看到是一个仿函数。我们使用优先级队列的时候也用过这个仿函数。集合是按照特定顺序存储唯一元素的容器。在一个集合中,元素的值也标识它(值本身就是键,类型为 T),并且每个值必须是唯一的。集合中元素的值在容器中不能修改(元素总是 const 类型的),但是可以从容器中插入或删除元素。在内部,集合中的元素总是按照其内部比较对象(类型为 Compare )指示的特定严格弱排序标准排序。

2024-08-21 00:03:30 1169

原创 [C++进阶]二叉树进阶的一些面试题(二)

(中序和后序跟前序的思路完全一 致,只是前序先访问根还是后访问根的问题。后序稍微麻烦- -些,因为后序遍历的顺序是左子树右子树根,当取到左路结点的右子树时,需要想办法标记判断右子树是否访问过了,如果访问过了,就直接访问根,如果访问过需要先访问右子树。这里访问右子树要以循环从栈依次取出这些结点,循环子问题的思想访问左路结点的右子树。这题是上面那题的姊妹题,换换顺序就能写好了。但是这道题我们的目的是用迭代做出来。2.再访问左路结点的右子树。

2024-08-19 01:06:27 172

原创 [C++进阶]二叉树进阶的一些面试题(一)

核心思想:我们在层序遍历过程中,增加一-个levelSize,记录每层的数据个数,树不为空的情况下,第1层levelSize=1,循环控制,第1层出完了,第2层就都进队列了,队列中size就是第2层的数据个数。这道题属于与基础题,首先我们观察输入输出样例可以得到如果root->left为空,root->right不为空时,我们的空格仍然需要保留,如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;上题我们搞完了,这题我们其实有个很简单的办法,我们把上题的代码赋值过来直接逆置即可。

2024-08-18 00:56:30 369

原创 [C++进阶]二叉搜索树的应用

前面我们讲过key模型和Key-Value模型就是常见的两种的模型。

2024-08-16 16:54:02 393

原创 [Linux]第七节 关于Linux版本,命令与权限的一些选择题

yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用 yum makecache将软件包信息缓存到本地,使用 yum clean all 清理老旧的缓存信息。14.你使用命令”vi/etc/inittab”查看该文件的内容,你不小心改动了一些内容,为了防止系统出为,你不想保存所修改的内容,你应该如何操作。解析: 沾滞位的作用:在设置的沾滞位的目录下,其它用户可以创建文件,但是只能删除自己的文件,不。C 在末行模式下,键入:x!

2024-08-14 19:57:21 877

原创 [算法初阶] 第一集 双指针

一、双指针概念相应大家的要求,所以我决定在开一个算法初阶的专栏,这样方便大家能够从我这的学习能够连贯。一、双指针概念常见的双指针有两种形式,⼀种是,⼀种是。:⼀般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同⼀个位置)left > right (两个指针错开)

2024-08-11 14:31:23 938

原创 [算法2] 第三集 剪枝

在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。

2024-08-11 01:07:31 563

原创 [算法2] 第二集 二叉树中的深度搜索

一、(DFS,全称为 Depth First Traversal),是我们树或者图这样的数据结构中常⽤的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分支,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。在⼆叉树中,常见的深度优先遍历为:前序遍历、中序遍历以及后序遍历。因为树的定义本⾝就是递归定义,因此采⽤递归的方法去实现树的三种遍历不仅容易理解⽽且代码很简洁。

2024-08-09 20:36:57 972

原创 [算法2]第一集 递归

我们再C语言和数据结构里都用了不少递归,这里就不多详细介绍。递归简单来说就是函数自己调用自己的情况二、为什么要用递归呢?本质来说其实就是我们在解决一个问题后出现相同的问题,解决这个问题后会再出现相同的问题。我们解决这些问题的方式一样,所以就出现了函数自己调用自己。

2024-08-07 22:44:41 1057

原创 [C++进阶&数据结构]二叉搜索树

对于二叉树的结点,我们类似于list的结点定义一样,使用一个struct类。

2024-08-07 10:53:46 1334

原创 [C++进阶]继承和多态的选择题

子类定义的虚函数的新的行为会操作a变量,在子类初始化时根据构造函数调用顺序会首先调用父类构造函数,那么虚函数回去操作a,而因为a是子类成员变量,这时a尚未初始化,这是一种危险的行为,作为一种明智的选择应该禁止这种行为。C. 选择题一定要扣字眼,题目前半句说的是基类引用 引用了子类对象,但是后半句调用虚函数时,说的是基类的对象调用f2,通过对象调用时编译期间就直接确定调用那个函数了,不会通过虚表以多态方式调用。C.A::f(),因为强制类型转化后,生成一个基类的临时对象,pa实际指向的是一个基类的临时对象。

2024-07-31 01:31:09 697

原创 [C++进阶]抽象类

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。至于为什么起这个抽象的名字,我们可以理解为,这个类在现实世界中没有实体。所以不能实例化出对象。而且由于派生类继承了抽象类,它里面也包含了纯虚函数,那么它自然也不能实例化出对象了。

2024-07-29 08:42:26 375

原创 [C++进阶]对于多态的底层逻辑

在前面我们也已经提到过,在语法层面称之为重写,重写的是它的实现。所以有时候我们也会提出一个概念,普通的函数的继承称为实现继承,而多态,虚函数的重写,其实就是一个接口继承,然后重写它的实现在原理上就是说将父类的虚函数表给拷贝下来,然后将子类中重写的部分给覆盖。其次,因为只有完成了虚函数的重写,那派生类的虚表里面才能是派生类的虚函数。这样的话,这个基类指针才能做到指向父类调用父类,指向子类调用子类。

2024-07-29 00:00:14 1137

原创 [C++进阶]多态的概念、定义与实现

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。多态的实现有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写(也就是要调用重写的虚函数)​​​​​​​。

2024-07-26 01:11:34 974

原创 [C++进阶]多继承和菱形继承

很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO(OO是面向对象,OOP是面向对象程序设计)语言都没有多继承,如Java。

2024-07-23 00:25:45 674

原创 [C++进阶]继承

Person类称为基类(父类),Student类称为派生类(子类)继承方式为public(公有)继承。

2024-07-22 17:03:05 680

原创 Leetcode215. 数组中的第K个最大元素

遍历数组将元素入堆;如果当前堆内元素超过 k 了,我们就把堆顶元素去除,即去除当前的最小值。因此我们在元素入堆的过程中,不断淘汰最小值,最终留在堆中就是数组中前 k 个最大元素,并且堆顶元素为前 k 大元素中的最小值,即为第 k 个元素。我们也可以使用堆排序来解决这个问题——建立一个小根堆,

2024-07-21 23:31:38 270

原创 [C++进阶]模板进阶

class 类模板名 {};T* _finish;

2024-07-21 23:04:39 1091 2

原创 [C++]优先级队列

优先级队列是一种容器适配器,根据一些严格的弱排序标准,专门设计使其第一个元素始终是它所包含的元素中最大的元素。此上下文类似于堆,其中可以随时插入元素,并且只能检索最大堆元素(优先级队列中顶部的元素)。优先级队列是作为容器适配器实现的,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素是从特定容器的“背面”弹出的,该容器称为优先级队列的顶部。基础容器可以是任何标准容器类模板,也可以是其他一些专门设计的容器类。

2024-07-19 23:27:54 1123

原创 [C++初阶]deque的讲解

Deque是双端队列的不规则缩写。双端队列是具有动态大小的序列容器,可以在两端扩展或收缩。特定的库可能以不同的方式实现deque,通常是某种形式的动态数组。在任何情况下,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩容器来自动处理存储。因此,它们提供了类似于向量的功能,但在序列的开始,而不仅仅是在序列的末尾,也可以有效地插入和删除元素。但是,与vector不同,deque不能保证将其所有元素存储在连续的存储位置:通过偏移指向另一个元素的指针来访问deque中的元素会导致未定义的行为。

2024-07-19 01:14:44 888

原创 [C++]一些list,stack和queue选择题和编程题

这时我们学完后的应用1.下面有关vector和list的区别,描述错误的是( )A.vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机存取,应该使用vectorB.list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用listC.vector<int>::iterator支持“+”、“+=”、“<”等操作符D.list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符。

2024-07-16 23:17:36 955

原创 [C++]reverse_iterator的封装实现

反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器;当反向迭代器执行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。

2024-07-16 15:01:59 209

原创 [c++初阶]stack和queue的使用以及模拟实现

区别于vector等容器,stack是一种容器适配器。通俗的讲,stack封装了一个其他的容器,并提供特定的成员函数来对容器进行操作并遵循栈的后进先出(Last-in First-out)原则。stack的底层容器至少要支持以下操作:empty:判空size:获取容器有效元素个数back:获取容器尾部元素push_back:尾插pop_back:尾删通过这些操作,我们就可以实现栈的压入和弹出等行为。

2024-07-16 00:57:50 895

原创 [Linux]第六节 Linux编译器gcc/g++

首先我们需要明确概念gcc只能用来编译c语言,g++即可用来编译c语言,又可用来编译c++,但我们一般用gcc编译c,g++编译c++

2024-07-15 18:30:35 977

原创 [Linux]第五节番外 添加sudoers

之前我们讲过sudo这个命令,它可以让我们普通用户进行短暂的提权,上回我们讲完了vim。把光标移动到这一行,然后我们yy复制,p粘贴,然后把开头的root改成我们自己的用户名。本篇是个短篇,目的就是让我们之后的学习中可以使用sudo命令。注意这里需要强制退出,我们需要输入。我们需要改的就是上面的这个文件。首先我们先登录root用户。以上,便是本篇的全部内容了。

2024-07-15 14:49:01 237

原创 [Linux]第五节 vim的使用

vim编辑器,用来文本编写,可以写代码它是一个多模式的编辑器它有很多的模,不过我们暂时先只考虑这三种模式。

2024-07-14 23:31:53 658

原创 [Linux]第四节 CentOS软件的安装

源代码安装(我们还需要进行编译运行后才可以,很麻烦)rpm安装(Linux的安装包,需要下载一些rpm包,但是彼此之间的依赖关系很严重)yum安装 (可以解决安装源,安装版本,安装依赖的问题)在Linux下安装软件一个通常的办法是下载到程序的源代码并进行编译得到可执行程序但是这样太麻烦了于是有些人把一些常用的软件提前编译好做成软件包可以理解成windows上的安 装程序)放在一个服务器上通过包管理器可以很方便的获取到这个编译好的软件包直接进行安装。

2024-07-14 22:33:45 1117

原创 [C++初阶]list的模拟实现

首先,我们一开始最先看到的就是这个结点的结构体,在这里我们可以注意到这是一个双向链表。有一个前驱指针,一个后继指针。然后在有一个存储数据的空间其次它的迭代器是一个自定义类型,而非原生指针。这里我们先不管,我们接着往下看。我们继续找成员变量,在这里我们就找到了成员变量,但是这个类型我们看不懂,于是我们先略过。通过对定义的查找,可以看到这个实际上还是一个指针。但是这个指针我们还是看不懂。于是我们继续去速览定义,于是就找到了这里。

2024-07-14 20:21:37 1292

原创 [Linux]第三节 权限

要知道权限,我们首先需要知道在Linux下用户的分类:在linux中用户一般分为两类:root:超级用户(基本不受权限的约束)普通用户:普通用户是受权限的约束的超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”

2024-07-14 13:29:23 1672

原创 [Linux]第三节番外 对Linux中的命令的本质

既然讲了这个,其实我们刚刚的操作就是把若将安装到系统,安装的本质就是拷贝,我们平时看到的安装进度条,实际上就是在完成对应的拷贝,把什么可执行程序啊,配置文件之类的拷贝,所以会让你选择相应盘符。但是其实命令本质就是可执行文件,其实这些命令都存储在bin目录下,我们可以。./ 就是当前目录下,加上./就是说明在当前木如下执行我们需要的可执行文件。不妨这样,我们把我们自己的可执行文件加入bin文件夹看看能否当命令使用。上回我们讲了Linux的指令,本篇是一个短篇,主要是对命令本质的讲解。

2024-07-11 21:15:28 373

原创 [Linux]第二节 基本指令(二)

mv命令是move的缩写,可以用来移动文件或者将文件改名(),是Linux系统下常用的命令, 经常用来备份文件或者目录。: mv [选项源文件或目录 目标文件或目录1.视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。2.当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。3.

2024-07-11 16:46:53 1051

原创 [C++初阶]list类的初步理解

并且在C++文档中,我们可以看到标准库中的sort也限定了迭代器的类型必须是可以进行随机访问(RandomAccess)的。实际上list的迭代器并不是用原生态指针进行模拟实现的,需要进行底层的封装,这里会在list的模拟实现的源代码中体现。但是list的删除操作一定会导致迭代器失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。list由于结构的特殊性,是无法使用标准库中的sort函数的,因为迭代器无法进行相减的操作。(请注意,此函数通过插入或擦除容器中的元素来更改容器的实际内容。

2024-07-10 10:59:08 985

原创 [C++初阶]vector的oj

将快指针 fast 依次遍历从 1 到 n−1 的每个位置,对于每个位置,如果 nums[fast]=nums[fast−1],说明 nums[fast] 和之前的元素都不同,因此将 nums[fast] 的值复制到 nums[slow],然后将 slow 的值加 1,即指向下一个位置。由于给定的数组 nums 是有序的,因此对于任意 i<j,如果 nums[i]=nums[j],则对任意 i≤k≤j,必有 nums[i]=nums[k]=nums[j],即相等的元素在数组中的下标一定是连续的。

2024-07-08 20:36:04 749

原创 [C++初阶]vector的模拟实现

上篇我们实现了STL学习的三步:能用,明理,能扩展中的能用,着篇我们要办到明理。所以,本篇,我们将会对于vector进行模拟实现。这里我们采用和之前一样的方法自己开一个命名空间,写出我们自己的vector类像这样。

2024-07-06 00:28:34 923

原创 [C++]迭代器失效

如果pos刚好对应最后一个元素,删除后迭代器pos就超出了有效元素范围,可能导致非法访问,属于迭代器失效。以上函数在使用时都可能会导致vector扩容,在扩容时原空间会被释放,迭代器就会指向一块被释放的空间。假设有迭代器pos,使用pos删除pos对应位置的元素后,该迭代器对应的元素发生改变,属于迭代器失效。当迭代器底层的指针指向的空间被销毁时,如果继续在程序中使用该迭代器,就会造成程序崩溃,这就是。迭代器失效后,如果我们需要继续使用迭代器,给迭代器重新赋值即可。本篇是对于vector的那篇章的补充。

2024-07-04 16:48:52 181

原创 [C++初阶]vector的初步理解

1. vector是表示可变大小数组的序列容器和数组一样,vector可采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。2. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小,以增加存储空间。其做法是:分配一个新的数组,然后将全部元素移到这个数组。

2024-07-04 00:56:58 1201

原创 string类的模拟实现的一些改进

上回我们完成了,不过之前写的传统写法本篇,我们将要对其进行一些改进,写成参考的是现代写法,这样写可以提高可读性。上回我们写好的string类//string.h以下是现代写法对于 传统写法的改进。

2024-06-09 22:17:35 445 2

原创 [C++初阶]string类的详解

//string.cpp现在我们看到的是,我这边写的,接下来我将会对于这些内容进行解析,首先我这边的模拟实现都是基于理解和string。 2.string类的定义和迭代器1)私有成员这里的内容比较少。2)公有成员3)迭代器我们都知道在string中我们常常使用迭代器来完成不少操作,我们知道迭代器其实就是一种指针,所以这里我们选择这样实现3.构造函数声明:这里我们选择用缺省函数保证字符串内容下面是搞函数的内部实现:首先我们用列表初始化得出

2024-06-09 14:32:05 860

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除