- 博客(19)
- 收藏
- 关注
原创 list 的核心成员函数及其模拟实现
在模拟实现了vector以后,下一个我们应该学习的就是C++ 中自带的链表结构 list 了。在我们实现vector的时候,发现vector的实现和传统的顺序表还是有差别的。那么我们今天要实现的list也会和以前实现的链表有很大的差别吗?本篇博客将从头开始实现List 的核心成员函数。list 在STL库中实现的是一个双向带头循环链表,这样可以多提供很多操作。
2025-08-27 10:04:19
537
原创 vector 的核心成员函数及其模拟实现
vector算是C++的 STL 中最常用,也是最重要的容器之一了。我们可以把vector看做是一个动态增长的数组。而这个数组可以存储任意类型的变量。动态增长的意思就是,当我们尝试向一个已经满的vector数组中插入新的元素的时候,它会自动进行一个扩容的过程。这个过程不需要我们来实现,我们也不需要管它。此外,vector 最大的优点莫过于它重载了 “ [ ] ” ,使我们可以像数组一样随机存取它的任意一个值,时间复杂度为O(1)。
2025-08-26 02:06:49
1003
原创 C++中string类的模拟实现
在C语言中,我们要实现一个字符串需要自己开辟一个 char 类型的数组。而到了C++中,C++给我们实现了一个叫 string 的类来实现字符串,专门用于存放字符串,并且实现了很多可以操控字符串的操作。那么本篇博客,我将带大家学习string类以及它的一些比较重要的成员函数,并且对这些成员函数进行模拟实现,以便我们更好的理解这些函数。因为string的历史已经有很久了,所以string中可能会出现一些没那么好的函数,也就是有一些函数会在功能上重叠。
2025-08-19 05:18:08
879
原创 初识C++函数模板及类模板
在C语言中,是不支持函数的重载的,C++支持了函数的重载,使得我们可以让同一个函数传进不同的参数,我们就可以不用改变函数的名字,从而让一个函数支持更多的形参传递。但还是太麻烦了,有没有更好的方法,能让我们写一个函数就可以完成类似于多个函数重载呢?有的兄弟有的。这就是我们今天要讲到的函数模板和类模板。
2025-08-15 15:15:19
303
原创 C++类和对象结尾篇
之前我们在实现构造函数的时候,初始化成员变量都是使用函数体内赋值,但是初始化成员变量还有一种方法,就是初始化列表,初始化列表的使用方式是以一个冒号开始,写一个成员名后面跟着一个括号,括号里面是要给这个成员变量的初始化值。也就是我们在构造函数的时候,可以在函数体外对成员进行初始化。每个成员变量在初始化列表中只能出现一次。在语法理解上初始化了列表可以认为是每个成员变量定义初始化的地方。那么看起来好像这种初始化的方式和函数体内并没有什么差别,那么设计出这种方法到底是有什么用呢?
2025-08-14 00:14:04
977
原创 从零掌握C++类的默认成员函数
默认成员函数就是用户没有自己实现出来,在编译的时候编译器也会自动生成的成员函数。在C++的类中,有6个默认成员函数,在这六个默认成员函数中,只有4个是相对比较重要的成员函数。本篇博客,我将从0开始慢慢讲解这几个默认成员函数。
2025-08-11 18:49:08
531
原创 初识C++的类和对象
类的定义和结构体类似,不过类的关键字是class ,我们可以把类看作是结构体的升级版,它的定义方式和结构体是类似的,都是关键字 名字{};。跟结构体一样,定义的时候不要忘记在最后的 “;C++是兼容C语言的,所以在C++里面也是可以定义结构体的。同时结构体类型也升级成为了类,比如我们可以在结构体中定义函数。不过一般情况下还是更推荐使用class。int _date;int _month;int _year;
2025-08-09 16:42:20
536
原创 C++基础——学习C++之前要知道的事情
在C++中存在着很多大量并且重复的变量。这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突,namespace关键字的出现就是针对这种问题的。在一个程序中,如果我们用多个同名的变量,那么系统会自动调用离调用位置最近的变量。下面这段代码,打印的数就会是 5。因为主函数中的局部变量 a 比全局变量 a 离的更近,所以打印的时候会优先调用近的变量。int a = 10;//结果为5。
2025-08-06 22:32:01
1015
原创 排序算法全解析:从冒泡排序到快速排序
排序算法是计算机科学中最基础却最重要的概念之一。无论是在日常的生活中,还是在工作和学习中,排序都会拥有应用的场景。本文将从较为简单的排序开始,一步步的迈向比较困难的排序,并附上代码实现。本篇默认排序的方法为升序排序。
2025-08-05 18:05:17
691
原创 堆的构建及其基本操作
接下来我们需要学习向下调整算法,在堆里面只有一种删除元素的方式,就是删除堆顶的元素,但是删除了堆顶的元素以后,我们无论拿哪一个节点都会让整个堆变的无序,所以为了避免堆变得混乱,通常我们会把数组尾的元素调到对头,然后对队头元素进行一个向下调整,因为我们只是删除了根节点的数据,其他的子树部分都还是符合堆的规则。如图,我们在数组的末尾添加了一个值1的节点,由于新节点的父节点的值一直是大于新节点的,所以新节点要一直往上调整,调整到根节点或者当前的父节点小于新节点的位置才可以停下。所以也就会出现无序的情况了。
2025-07-30 05:04:57
503
原创 栈和队列以及它们的实现
栈是一种特殊的线性表,它只能在固定的一端进行插入和删除操作。进行数据插入和删除的一端被称为栈顶,而另一端则称为栈底。由于栈只能从一端进行插入和删除数据,所以栈具有后进先出的原则。除了栈顶元素以外,所有的元素都会被栈顶元素压着,所以只能从栈顶这一边插入或删除元素。栈的出栈顺序不是固定的,我们可以把所有的数据都入栈后再出栈,也可以一遍入栈一边出栈,但是无论怎么出都必须遵循后进先出的原则,被压着的元素是不可以出栈的,只有栈顶元素可以进行出栈。
2025-07-24 11:29:43
883
原创 为什么快慢指针一定可以判断链表是否带环
(如果快指针走到头,也就是走到了NULL,我们就直接跳出while循环,然后返回false,说明这个链表不是带环的,因为快指针走到头了)当快慢指针都入环以后,快指针一次在环里面走两步,无论环有多大,快指针跟慢指针的距离总会缩短一个节点的距离。所以在C为偶数并且N是奇数的情况下,这种情况快指针是永远追不到慢指针的。在我们做链表题的时候,会碰到一些题让我们判断一个链表带不带环,或者是让我们判断一个带环链表的入环节点在哪里,但是当我们看到题解的时候就会发现,解决这种题的代码非常简单,甚至用不了多少行就可以解决。
2025-07-20 20:06:43
703
原创 整数和浮点数在内存中存储的区别
小数部分是0.5,由于他在小数点的右边,所以小数部分的计算是2的负数次方,在这个例子中,0.5是2^(-1),所以小数点右边就是1,如果是0.25,就是2^(-2),以此类推。double的存储规则类似,第一个也是符号位,但是他的指数位E有11位,剩下的52位就是M,所以double会比float更精确一些,原因就是他可以往小数点后面的位数更多一些,但是小数是不能够在内存中精确存储的,有的时候总会出现一点误差,这是无法避免的,但是只要我们控制一下误差,让它在一个可以接受的范围内就可以了。
2025-06-28 13:46:22
305
原创 指针和数组的关系
这时,我们会发现前两个指针+1以后只往后移动了一个单位(4个字节的长度),而最后一个&arr+1以后却直接向后移动了5个单位(20个字节的长度),这说明&arr取到的地址其实是整个数组的地址,而不是和前两个一样只是首元素的地址。我们知道,函数接受到的参数只是数组的首元素的地址而已,所以如果我们在函数内部使用传递进来的地址计算长度,我们只能得到首元素的长度,也就是一个单位的长度。不难看出, 数组的自己本身就是地址,它的地址跟首元素的地址是一样的 , 所以如果我们对数组名取地址的话, 得到的结果也是同样的。
2025-06-21 10:00:03
740
原创 指针大杂烩(1)
先叠个甲 , 本篇博客仅记录我个人对于指针学习心得和领悟, 指针当然还有很多我还没有涉及的东西, 这些以后再说接下来就让我写一写我对于指针的一些心得和体会 , 有错的话欢迎各位大佬指正。
2025-06-18 01:18:09
534
原创 C语言的分支和循环
在C语言的平时使用中 , 使用的最多的也就是接下来要讲到的分支和循环语句,可以说大部分的代码都离不开这些语句在正式介绍这些语句之前 , 我觉得有必要先介绍一下C语言中的逻辑操作符 , 它们分别是 &&(逻辑与) , ||(逻辑或) ,!(逻辑取反)在C语言中, 0 表示假 , 非0表示真 (一切不是0的数都是真 , 包括负数)
2025-06-05 23:34:07
674
原创 学习C语言之前应该要知道的一些事情
每一个能成功运行的程序一定有且仅有一个main函数 , 不管他的源文件有多少个 , 在这些源文件中只能存在一个main函数 , 如果出现了多个main函数编译器会报错. main函数是程序执行的入口 , 程序是从main函数开始执行的.下图便是一个完整的main函数框架。
2025-06-03 09:35:29
862
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人