- 博客(21)
- 收藏
- 关注
原创 【C++】string类的底层
上一篇博客已经对string类进行了简单的介绍,大家只要能够正常使用即可。在面试中,面试官总喜欢让学生自己来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。大家看下以下string类的实现是否有问题?说明:上述String类没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造。最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一块空间被释放多次而引起程序崩溃,这种拷贝方式,称为浅拷贝。
2025-01-07 19:24:04
352
原创 C++类与对象(下)
之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表是以“:”开头,接着是以","分割的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或者表达式。每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表的位置进行初始化,否则会编译报错。
2024-12-28 00:16:20
584
原创 【C++算法】1.【模板】前缀和
用sum[i]表示:[1,i]区间内所有元素的和,那么sum[i-1]里面存的就是[1,i-1]区间内所有元素的和。那么可得递推公式sum[i]=sum[i-1]+arr[i]。b.使用前缀和数组快速求出某个区间内元素的和:当询问[l,r]时:区间内所有元素的和为sum[r]-sum[l-1]。
2024-12-24 22:59:54
312
原创 C++:类与对象(中)
析构函数的功能与构造函数刚好相反,析构函数不是完成对对象本身的销毁,比如局部对象存在函数栈帧的,函数结束栈帧销毁,他就释放了,这不需要我们管。构造函数时特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是函数栈帧创建时,空间就开好了),而是对象实例化时初始化对象。赋值运算符重载是一个默认成员函数,用于两个已经存在的对象直接进行拷贝赋值,这里要注意拷贝构造区分,拷贝构造是一个已经存在的拷贝初始化个另一个要创建的对象。举个例子:括号匹配问题。
2024-08-23 15:46:33
1249
5
原创 C++:类与对象(上)
1.class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面的分号不能省略。这个和我们在C语言中的结构体比较类似,下面会讲到类和结构体的区别。类主体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。2.为了区分成员变量,一般习惯会在成员变量之前加个特殊标识,比如在成员变量前面加_或者m进行区分。这个不是强制的,主要看自己的需求。
2024-08-21 14:00:36
1076
2
原创 初识C++(下):const引用/inline/nullptr
可以引用一个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能被放大需要注意是类似 :int& xx = x * 3;这样的场景下x*3的结果会保存在一个临时对象中,int& aa = ret;也类似,在类型转换中会产生临时对象存储中间值,也就是说xx和aa都是引用的;临时对象,而C++的临时对象具有常性,所以这里触发了权限放大,我们必须用常引用才行。
2024-08-16 11:25:13
706
3
原创 初识C++:开启C++之旅
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量、函数、类型等。2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand就不在冲突了。//命名域将rand和函数rand隔开int data;int main()//这里访问的是rand函数指针//这里访问的时lcl命名空间中的randreturn 10;
2024-08-15 13:25:27
1278
3
原创 排序: 插入\希尔\选择\归并\冒泡\快速\堆排序实现
排序:所谓排序,就是一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
2024-08-14 00:14:20
1578
9
原创 数组结构:链式结构二叉树
用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。二叉树的创建方式比较复杂,为了更好的步入到二叉树内容中,我们先手动创建一棵链式二叉树。回顾二叉树的概念,二叉树分为空树和非空二叉树,非空二叉树由根结点,根结点的左子树,根结点的右子树组成的根结点的左子树和右子树分别是由子树的结点,子树结点的左子树和子树结点的右子树组成,因此二叉树定义是递归式的,后序链式二叉树的操作中基本都是按照该概念实现的。
2024-08-09 23:48:09
837
1
原创 数据结构初阶:栈和队列
栈的结构的定义和顺序表结构定义一样,在栈中定义一个指针data用于操作数据,然后定义整型变量capacity用于表示栈的空间大小,最后定义一个整型变量top用于表示有效数据个数也就是我们的栈顶。//定义一个栈的结构//数组//栈的空间的大小int top;//有效数据个数}ST;队列的结点结构就是单链表结点结构,队列结构phead指向头结点和ptail指向尾结点,还有一个size用同统计结点个数。//链式结构表示队列}QNode;//队列结构int size;//计数器。
2024-08-03 23:28:06
1311
32
原创 双向带头循环链表
目录一.概念与结构二.双向带头循环链表的创建1.创建双向链表结点的结构2.初始化双链表3.对双向链表进行尾插4.打印双向链表5.对双向链表进行头插6.对双向链表进行尾删7.对双向链表进行头删8.查找指定数据的结点9.在指定位置之后插入10.删除指定位置11.销毁链表三.总结双链表的全称叫”双向带头循环链表“。双链表的头节点和之前在单链表的头节点是两个概念,实际上前面在单链表阶段称呼不严谨,只是为了我们更好的理解就直接称之为单链表的头结点。带头链表里的头节点实际为”哨兵位“,哨兵位结点不存储任何有效元素,只是
2024-08-02 23:02:27
609
6
原创 letcode:141.环形链表1
环形链表是一种特殊的链表数据结构,其链表最后一个结点的next指针指向链表中的某个结点,从而形成闭环。换句话说,链表里的最后一个结点的next指向链表中的某个结点,而不是通常情况下指向一个空指针(NULL)。如图所示:由于环形链表不像普通链表一样最后一个结点的next指针指向空指针,所以我们不能像我们平时用pcur=pcur->next的方式去遍历链表,这样会造成死循环。
2024-07-31 23:21:58
559
7
原创 顺序表和单链表
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串.....线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2024-07-30 21:27:50
493
7
原创 算法复杂度
衡量一个算法的好坏,一般从时间和空间两个维度来衡量。即时间复杂度和空间复杂度。时间复杂度主要是衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外的空间。不过随着计算机的快速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
2024-07-27 00:52:17
1182
6
原创 C语言各种关于的文件操作(最详细)
磁盘上的文件就是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度分类的)。
2024-07-23 16:18:38
698
4
原创 扫雷游戏的实现
扫雷游戏网页版 - Minesweeper本站提供了经典扫雷游戏,并略作改进,在电脑或手机上打开网页就可以玩,无需下载安装。增加了满屏级别,自适应屏幕大小。成绩榜实时显示大家的在线扫雷成绩。
2024-07-18 15:26:43
2670
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人