- 博客(36)
- 收藏
- 关注
原创 【C++】STL--string(下)
如果对象中管理资源,最后就会导致 多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该 资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差 不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可 以连接字符串。//这是传的不是别名会有拷贝构造,拷贝的不就是我想要的吗所以直接交换。
2024-09-26 04:30:00 808 7
原创 【C++】STL--string(上)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、 快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。
2024-09-15 22:13:37 812 9
原创 C/C++内存管理
private:int main()//对于自定义类型,new能够调用构造初始化,malloc不会//传参构造//会调用10次默认构造//匿名//也可以直接写,进行隐私类型转换delete p1;delete p2;return 0;
2024-09-10 15:10:09 1096 1
原创 【C++】类和对象(下)
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化,每个成员变量都要⾛初始化列表初始化;
2024-09-09 12:33:22 972 2
原创 【C++】类和对象(中)
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并 不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化 对象。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数⾃动调⽤的 特点就完美的替代的了Init。2.2构造函数的特点1. 函数名与类名相同。2. ⽆返回值。(返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此)3. 对象实例化时系统会⾃动调⽤对应的构造函数。
2024-09-07 13:42:42 799 5
原创 【C++】类和对象(上)
1.class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。2.为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。代码展示。
2024-08-31 18:55:33 849 3
原创 【C++】基础入门
1.定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。3. C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-08-29 23:05:00 852 1
原创 十大经典排序算法:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序
1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2),什么情况最坏:逆序,最好:顺序有序:O(N)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定1. 希尔排序是对直接插入排序的优化。2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
2024-08-26 14:49:43 1086 1
原创 二叉树OJ刷题与讲解
首先我们要知道returnSize表示的是数组元素个数,这里传过来的是一个指针类型的变量,因为函数外面可能会用到这个值,而return只能返回一个值,所以这里传地址过来是想形参改变实参,题目要求把中序遍历的结果存放在一个数组中所以我们要开辟空间,那么开辟多少空间合适呢我们可以求一下节点个数然后来申请,求节点个数也是非常简单我们用*returnSize接收,接着创建数组,进行中序遍历,这里需要定义一个函数专门用来中序遍历,因为遍历二叉树需要递归。
2024-08-19 23:15:18 713
原创 【数据结构】二叉树链式结构的实现
在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。注意:上述并不是创建二叉树的方式,真正创建二叉树的方式期待后续博客再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是:1. 空树2. 非空:根结点,根结点的左子树、根结点的右子树组成的。
2024-08-19 18:21:05 734 1
原创 【数据结构】堆的实现和堆排序--TOP-K问题
在头文件中进行堆的定义和接口的声明int size;}HP;//堆的初始化//堆的销毁//堆的插入//堆的删除//取堆顶的数据// 堆的数据个数//堆的判空堆的实现堆是一种特殊的树形数据结构,通常实现为完全二叉树。堆分为最大堆和最小堆,最大堆的父节点值大于或等于其子节点值,而最小堆的父节点值小于或等于其子节点值。堆通常使用数组来实现,通过索引关系模拟树形结构,支持高效的插入、删除和查找最大/最小元素操作。堆排序堆排序是一种基于堆的排序算法。
2024-06-21 18:00:16 1214 13
原创 【数据结构】二叉树概念及结构
二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点(左子节点和右子节点)。它在计算机科学中广泛应用,如搜索算法、排序和数据压缩等。了解二叉树的基本概念、结构和性质对于掌握数据结构和算法至关重要。
2024-06-15 15:02:00 853 3
原创 队列的实现
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头队列(Queue)是一种线性数据结构,其特殊之处在于它遵循先进先出(FIFO)的原则。队列的主要操作包括在队列的一端插入元素(称为入队,enqueue)和在另一端移除元素(称为出队,dequeue)。由于这种操作限制,队列在访问和操作元素时表现出一种特殊的顺序性。先进先出(FIFO)
2024-06-10 07:00:00 1127 6
原创 栈的实现和括号匹配问题
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。后进先出栈是一种特殊的线性数据结构,它遵循后进先出(Last In, First Out,LIFO)的原则。栈的主要操作包括在栈顶插入元素(称为压栈,push)和从栈顶移除元素(称为弹栈,pop)。
2024-06-10 06:45:00 889
原创 链表算法题(OJ刷题超详细讲解)
经过这次对链表算法题的深入解析,链表作为基础数据结构,其相关算法是编程能力的试金石。通过在线刷题平台,我们可以不断挑战自我,深化对链表的理解,提高算法设计能力。刷题能够让我们更加熟悉各种算法和数据结构,掌握它们的基本操作和应用场景。通过大量的实践,我们能够加深对理论知识的理解,形成自己的编程风格和思维方式。刷题不是目的,应用才是关键。让我们通过刷题,不断提升编程水平,将所学知识应用于实际项目中,成为更优秀的开发者。
2024-06-02 23:29:49 1178 6
原创 空间复杂度
尽管现代计算机的存储容量已经很高,使得在大多数情况下,算法的空间复杂度不再是绝对的限制因素,但这并不意味着我们可以忽视算法的空间复杂度。空间复杂度仍然是评估算法性能的一个重要指标,因为它反映了算法在运行过程中对内存资源的占用情况。因此,尽管在某些场景下空间复杂度可能不是首要考虑的因素,但在设计和实现算法时,我们仍然需要适当关注算法的空间复杂度,并根据具体情况进行优化。特别是在处理大规模数据、资源受限环境或考虑成本效益的场景中,优化空间复杂度能够显著提升算法的性能和效率。
2024-06-02 23:29:34 442
原创 【C语言】函数递归(超详解)
递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问 题,代码最终也会陷⼊死递归,导致栈溢出(Stack overflow)。
2024-05-29 23:02:56 989
原创 算法的时间复杂度(详解)
时间复杂度是衡量算法执行效率的重要指标,它表示算法随输入数据规模增长时执行时间的变化趋势。优化时间复杂度可以节省计算资源、提高系统性能、满足实时性要求,并提升用户体验。在设计算法时,应充分考虑时间复杂度的优化,以实现高效、稳定的性能表现。
2024-05-29 22:49:22 3677 4
原创 数据结构--单链表的基本操作
概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。链表也是线性表的一种。链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只 需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。⻋厢是独⽴存在的,且每节⻋厢都有⻋⻔。想象⼀下这样的场景,假设每节⻋厢的⻋⻔都是锁上的状 态,需要不同的钥匙才能解锁,每次只能携带⼀把钥匙的情况下如何从⻋头⾛到⻋尾?
2024-05-14 23:53:29 751 11
原创 数据结构---顺序表
数据结构是由“数据”和“结构”两词组合⽽来。什么是数据?常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等 等)、⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据 什么是结构?当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性 ⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的 ⽅式。
2024-05-09 00:10:23 1041 2
原创 【C】语⾔内存函数--超详解
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。针对内存进行拷贝(头文件<string.h>)对于重叠的内存,交给memmove来处理。
2024-05-03 16:24:32 360
原创 【C语言】字符函数和字符串函数--超详解
在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。
2024-05-02 21:22:00 2023 5
原创 【C语言】数据在内存中的存储
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。VS上采用的是小段存储上述概念需要记住,⽅便分辨⼤⼩端。
2024-05-02 14:57:50 637 1
原创 【C语言 】自定义数据类型(二)
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所 以联合体也叫:共⽤体给联合体其中⼀个成员赋值,其他成员的值也跟着变化。运行结果:为什么是4呢?
2024-05-01 16:41:24 729 2
原创 【C语言】操作符超详解
/代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化。struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化//代码3int data;//结构体嵌套初始化//结构体嵌套初始化。
2024-04-29 00:02:51 677
原创 C语言预处理详解
基本语法:#define reg register //为 register这个关键字,创建⼀个简短的名字;) //⽤更形象的符号来替换⼀种实现case //在写case语句的时候⾃动把 break写上。// 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏符)。思考:在define定义标识符的时候,要不要在最后加上;?建议不要加上;这样容易导致问题。max = MAX;
2024-04-27 15:53:41 731
原创 C语言编译和链接
在ANSI C的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)第2种是执⾏环境,它⽤于实际执⾏代码。
2024-04-24 20:58:24 639
原创 C语言动态内存管理
通过以上例子我们可以总结一下几点:1.在声明变量时,内存空间已经开辟好了,并且开辟的是固定值。2.在声明数组的时候,必须指定数组长度以及数组的元素个数,并且以后不能改变数组的长度。那么这样可能会造成内存浪费,于是就有了动态内存管理,让程序员自己来动态内存的申请空间,要多大空间 就申请多大空间,这样就比较灵活了。
2024-04-23 23:03:54 669 1
原创 冒泡排序和qsort函数
如上图所示,我们先把第一个数字和其相邻的数字进行比较,大则交换,小则不交换(停止),这样对一个数字进行以上操作称为一趟冒泡排序,所有的数字进行以上操作至少要9趟冒泡排序。qsort是一个库函数用来排序数据,底层使用的是快速排序的方式,qsort函数可以排序任意类型数据。举个例子:如果p1 < p2返回小于0的数 ,p1==p2返回0,p1>p2返回大于0的数。冒泡排序的思想:两两相邻的元素进行比较,如果不满足顺序就交换,满足顺序就找下一对。第四个参数是一个函数指针,指向的就是两个元素的比较函数。
2024-04-22 00:23:53 284
原创 C语言——指针超详细讲解
指针就是内存地址内存地址就是指针,或者说指针是用来存放内存地址的。这意味着当我们有一个变量的地址时,我们可以将这个地址存储在一个指针变量中,我们口头说的指针其实指的是指针变量,指针变量就是一个存放地址的变量。
2024-04-21 18:11:35 1402 2
原创 C语言⽂件操作超详解易懂
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。
2024-04-03 20:25:55 877 4
原创 C语言自定义数据类型(一)
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚⾄是其他结构体。声明结构体的关键字是struct//名字int age;//年龄//性别//分号要记得加上上述代码定义了一个student结构体的类型(名字可以自定义),结构体的类型可以用不同的类型,该类型包含了三个成员变量:name、age、和sex。int x;int y;char a[10];}p1;//声明类型的同时定义变量p1//定义结构体变量p2int main()
2024-03-28 20:49:19 850 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人