- 博客(41)
- 收藏
- 关注
原创 C++----模板进阶
模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。模板会导致代码膨胀问题,也会导致编译时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2023-10-28 18:22:39
262
原创 C++STL----priority_queue的使用与模拟实现
priority_queue(优先队列)是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。标准容器类vector和deque满足这些需求。
2023-10-27 16:48:33
205
原创 C++STL----Stack&Queue的模拟实现
原理介绍deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上deque是如何借助其迭代器维护其假想连续的结构呢?
2023-10-27 14:26:30
186
原创 C++STL----Stack&Queue的使用
stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
2023-10-27 11:26:11
148
原创 C++STL----list的模拟实现
list迭代器类,实际上就是对结点指针进行了封装,对其各种运算符进行了重载,使得结点指针的各种行为看起来和普通指针一样。(例如,对结点指针自增就能指向下一个结点)
2023-10-26 19:50:30
422
原创 C++STL----list的使用
list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是带头双向链表,带头双向链表中每个元素存储在独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。
2023-10-26 14:14:24
431
原创 C++STL----vector的模拟实现
当vector存储的数据是**内置类型或无需进行深拷贝的自定义类型**时,可以使用memcpy函数拷贝当vector存储的数据是**需要进行深拷贝的自定义类型**时,就不能使用memcpy函数拷贝了
2023-10-19 21:49:17
56
原创 C++STL----vector详解
vector是表示可变大小数组的序列容器。与数组类似,vector也采用的连续存储空间来存储元素。可以采用下标对vector的元素进行访问。vector的大小是可以动态改变的,而且它的大小会被容器自动处理。当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。
2023-10-19 16:33:34
57
原创 C++STL----string类的模拟实现
此时我们将从find函数接收到的值镜面对称后,得到的是待查找字符串的最后一个字符在对象C字符串中的位置,而我们需要返回的是待查找字符串在对象C字符串中的第一个字符的位置,所以还需做进一步调整后才能作为rfind函数的返回值返回。因为拷贝对象的_str与源对象的_str指向的并不是同一块空间,所以拷贝出来的对象与源对象是互相独立的。尾插前需要判断当前字符串的空间能否容纳下尾插后的字符串,若不能,则需要先进行增容,然后再将待尾插的字符串尾插到对象的后方。其中一个对象的改动会对另一个对象造成影响。
2023-10-13 21:32:20
212
原创 C++STL----string类
使用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。:若给出的n大于对象当前的capacity,则capacity也会根据自己的增长规则进行扩大。:由于浮点数不能在内存中精确保存,故转换为字符串时,可能小数点后面的数有偏差。空字符串中并不是什么都没有,其中存在一个’\0’字符;
2023-10-12 12:15:27
126
原创 C++基础----模板初阶
class 类模板名// 类内成员定义实例:用c++实现栈public:, _top(0)_top = 0;//c++中使用new扩容//1.开新空间 2.拷贝数据 3.释放旧空间if (_next)_top++;注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。
2023-10-05 11:25:12
209
原创 C++基础----内存管理
new和delete的用法//malloc:在堆上申请内存空间//失败返回NULL,故malloc需要检查返回值//释放空间free(p1);//new :1.先在堆上申请内存空间 2.再调用默认构造函数初始化//new 失败不需要检查返回值,失败抛异常//没有默认构造函数的情况下,程序编译会报错//但可通过手动传参,使对象初始化。
2023-10-04 20:15:55
250
原创 Linux进程控制
子进程刚被创建时,与父进程共享代码和数据,但当子进程需要进行进程程序替换时,也就意味着子进程需要对其数据和代码进行写入操作,这时便需要将父子进程共享的代码和数据进行写时拷贝,此后父子进程的代码和数据也就分离了,因此子进程进行程序替换后不会影响父进程的代码和数据。进程程序替换之后,该进程对应的PCB、进程地址空间以及页表等数据结构都没有发生改变,只是进程在物理内存当中的数据和代码发生了改变,所以并没有创建新的进程,而且进程程序替换前后该进程的pid并没有改变。新进程为子进程,而原进程为父进程。
2023-09-25 19:33:04
52
原创 Linux进程地址空间
当程序在编译成可执行文件,且还没被加载到内存的时候,程序内部由地址吗?程序内部的地址,依旧用的时编译器编译好的虚拟地址,当程序加载到内存的时候,每行代码,每个变量便具有了物理地址且这个物理地址是外部的,程序内部还是编译时的虚拟地址。
2023-09-17 18:09:37
91
1
原创 Linux进程概念
一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,有时虽可运行但分不到处理器,有时虽有空闲处理器但因等待某个时间的发生而无法执行,这一切都说明进程和程序不相同,进程是活动的且有状态变化的,于是就有了进程状态这一概念。优先级存在的主要原因就是资源是有限的,而存在进程优先级的主要原因就是CPU资源是有限的,一个CPU一次只能跑一个进程,而进程是可以有多个的,所以需要存在进程优先级,来确定进程获取CPU资源的先后顺序。: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
2023-09-16 21:24:19
340
原创 Linux---初识操作系统
简单来说,操作系统就是一款进行软硬件资源管理的。为用户程序(应用程序)提供一个良好的执行环境。其他程序(例如函数库,shell程序等等)与硬件交互,管理所有的软硬件资源。任何计算机系统都包含一个基本的。,称为操作系统(OS)。
2023-09-10 20:33:54
152
原创 Linux基础工具的使用
yum是一个在Fedora、RedHat以及CentOS中的前端软件包管理器,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
2023-09-09 19:24:19
50
原创 Linux----权限
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。
2023-09-06 13:22:11
51
原创 C++基础----类和对象(二)
拷贝构造函数特征前置++和后置++重载赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回this :要复合连续赋值的含义总结
2023-09-04 12:08:38
47
原创 C++基础----类和对象(一)
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加本章只是类和对象中的一些基础知识,主要是对类和对象的一些了解和一些重要知识的剖析,对于类和对象的熟练使用还需要再学习后面的知识,然后多刷题才是重中之重!
2023-09-04 11:50:36
68
原创 C++基础----入门
本章只是对C++入门基础知识的大概了解,有些基础知识需要后面的知识才能理解。本章重点为C++的一些基础语法以及引用的概念,使用等。
2023-06-30 21:45:48
97
原创 Linux常用命令
用于测试主机间网络连通性,发送出基于ICMP传输协议的数据包,要求对方主机予以回复,若对方主机的网络功能没有问题且防火墙放行流量,则就会回复该信息,我们也就可得知对方主机系统在线并运行正常了。**功能:**将uuencode编码后的档案还原,uudecode只会将begin与end标记之间的编码资料还原,程序会跳过标记以外的资料。用于拷贝及转换文件,从一个文件或设备读取数据,并将其写入另一个文件或设备。ifconfig [参数] [网卡名] [动作]route [参数] [域名或IP地址]
2023-06-19 17:16:53
71
原创 排序算法复杂度及稳定性分析
如果排序前后它们的相对位置不发生变化,则称该排序算法是稳定的;否则称该排序算法是不稳定的。排序算法的稳定性指的是对于具有相同关键字的元素,在排序前后它们的相对位置是否发生变化。
2023-05-31 13:08:01
63
原创 排序----- 计数排序,基数排序
计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。时间复杂度:O(MAX(N,range)),range表示范围(Max函数:取两者中大的那个数)空间复杂度:O(range),range表示范围稳定性:稳定时间复杂度:基数排序的时间复杂度为O(d(N+k))其中d是元素的位数,N是元素个数,k是基数。当d较小,k不是很大时,基数排序的时间复杂度可以达到线性级别,比如在对电话号码进行排序时。O(k+n),N是元素个数,k是基数稳定性:稳定计数排序是非比较排序,需要移动数据。
2023-05-30 21:52:53
126
原创 排序-----归并排序,外排序
归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定将两个有序的数组进行归并,归并后还有序。对于无序的数组,可先用分治的思想,将其分为不可再分的子区间后,再进行归并,从而达到整体有序。归并的非递归可以用栈或者队列来实现,实现方法于快排的非递归法差不多,都是用栈或者队列保存子区间下标,但也可以不用栈和队列,可直接用gap来表示每次递归的间距,通过循环使gap变化,也能产生同样的效果。
2023-05-30 15:46:26
162
原创 排序-----选择排序,堆排序
直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2) (最好和最坏都是O(N^2)空间复杂度:O(1)稳定性:不稳定堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定选择型的排序中,两个排序都比较好理解,选择排序的效率极其低,堆排序好很多,使用堆排序时,一定要先对待排序数组建堆,并且用向下调整建堆,向下调整建堆相比于向上调整建堆快一点,建好堆后,需用向下调整进行排序,这节内容的核心是堆的两种调整算法。
2023-05-29 22:05:31
59
原创 排序-----冒泡排序,快速排序
冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2) 最好:O(N)空间复杂度:O(1)稳定性:稳定快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定快速排序这一节知识点很多,要求掌握单趟快排的前后指针法,其他两种方法也要了解。快排的非递归也要掌握!快排的基本思想:选一个最左边或最右边的数做key,然后通过指针去将比key大的数,比key小的数分别放在key的两边,用到了分治的思想。
2023-05-29 22:00:04
54
原创 排序-----插入排序,希尔排序
时间复杂度:O(N^2)最好:O(N) ------顺序有序或者接近有序最坏:O(N^2) ------逆序空间复杂度:O(1)稳定性:稳定希尔排序是对直接插入排序的优化。**当gap > 1时都是预排序,目的是让数组更接近于有序。**当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定。时间复杂度。
2023-05-29 15:25:57
376
6
原创 二叉树OJ练习题
这些题难度都是简单,但是要自己单独做出来还是会有困难的,对二叉树的理解没有那么深刻,递归用的也是不熟悉。做过一遍后,再回过头来看一遍,发现逻辑还是不难的,核心还是要掌握递归的分治思想。
2023-05-21 10:00:00
93
原创 链式二叉树-----递归实现
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小。
2023-05-20 10:00:00
591
原创 二叉树的遍历----递归实现
二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。二叉树的深度优先遍历主要用到了递归的思想,广度优先遍历用到了队列。递归思想的核心是把大事化小,还有就是递归的限制条件,这两点是很重要的。层序遍历考验了我们对队列的掌握程度。
2023-05-19 12:22:58
176
1
原创 堆,Top-K, 堆排序 ---详解
这章的干货还是挺多的,堆的数据结构本身并不算很难把握,本章的重点难点就是向下调整算法和向上调整算法,还有一些堆的性质,例如堆是完全二叉树,最后一层的节点必须是连续的,且堆只有两种结构,即大堆和小堆等性质,还有孩子节点的下标和父节点的下标的关系式。
2023-05-13 20:05:09
618
2
原创 栈和队列----循环队列详解
初次看循环队列的时候有点懵,没咋理解,后来又返回去看了一遍,这下全看懂了。相对来说,数组实现的循环队列比链表实现的循环队列要难点,就是那个循环点那儿得小心分析,不然就掉坑里了。链表实现循环队列感觉就是写循环单链表的感觉。
2023-05-10 09:00:00
629
原创 (C语言)用队列实现栈,用栈实现队列
最近在实训学爬虫,这两天看了下python,觉得比较有意思,好好学一下,希望真的能学到东西,用队列实现栈的这个题目,搞了我差不多大半天,一直在调,差点把电脑砸了,后来发现是Queuesize函数里面的那个计数器那里错了。后来先那个代码太乱了,索性直接删了重新写,理清思路后很快就写出来了,太搞心态了,总体来说,这两个题目还是很简单的,就是得把握好边界。
2023-05-09 16:31:02
200
原创 栈和队列----队列详解
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头。最近没啥状态,栈和队列都学的迷迷糊糊的,找个时间得好好复习一下。队列感觉还好,不是很难,可以理解,有时候一些边界会控制不好,有时候有自己的一些想法,但写出来就是依托答辩,根本不能跑,可能想法是错误的,也有可能就是没有真正理解吧。
2023-05-08 20:21:57
91
原创 栈和队列----栈详解
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的不同实现形式:数组栈 即用顺序表实现的栈,性能方面优于链表栈。由于栈的特性,从栈中存取数据只能在栈顶,所以就不存在在栈底或栈的中间位置存取。将顺序表的头部做栈底,尾部做栈顶,栈存取数据更加方便。
2023-05-08 16:24:28
227
1
原创 单链表的带环问题延申
现在,来对问题进行一个延申:判断链表是否带环,若带环,返回第一个入环的结点。中的无头单向循环链表中提到了。判断单链表是否带环已经在。
2023-05-05 13:58:42
54
1
原创 链表------双向链表详解
双链表在增删改查方面比单链表方便很多,但在存储空间方面,单链表是比双链表更优的,根据场景不同,两种链表都能发挥出其优点。在学习链表方面,还是要注意区分头指针和头结点!不懂就查,不懂就问,不会就多练!
2023-05-05 11:55:00
2075
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人