- 博客(39)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 指针的函数传参的详细讲解(超详细)
我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的 数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何 ⾼效的管理呢?传的是其值,但其他本身就又是一个指针,其本身就存着别人的地址,归根揭底还是传的是地址,所以用一级指针接收,进行解引用,同样可以改变指针指向的内存,对于指针,还有void* 的还有用const修饰,指针+整数,野指针,assert断言,字符指针,字符指针常量,这里不在多赘述。
2024-03-14 22:49:34
3357
14
原创 AVL树(平衡二叉搜索树)
int _bf;, _bf(0), _kv(kv){}某节点的左子树与右子树的高度(深度)差即为该节点的平衡因子(BF,Balance Factor),平衡二叉树中不存在平衡因子大于 1或小于-1的节点。在一棵平衡二叉树中,节点的平衡因子只能取 0 、1 或者 -1 ,分别对应着左右子树等高,左子树比较高,右子树比较高。
2024-08-16 15:10:35
563
原创 set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
2024-08-14 13:48:40
813
原创 二叉搜索树
对于其中得中序遍历,可以看到上面得函数是没有带参数的,这是因为方便随时检查,简单的来说,在main的作用域内,如果中序遍历带上参数根节点,那么如果在代码中途进行检测的时候还需要保存根节点然后进行传参进行遍历,这显然是略有麻烦的,所以最好实现一个二叉搜索树的中序遍历接口,当我们对二叉搜索树进行一次操作后,可以调用中序遍历接口对二叉搜索树进行遍历,若二叉搜索树进行操作后的遍历结果仍为升序,则可以初步判断所实现的接口是正确。故而左节点,根节点,右节点的大小关系为:左节点
2024-08-12 22:51:05
1007
原创 c++--多态
上一篇文章已经介绍了c++的继承,那么这篇文章将会介绍多态。看完多态的概念,你一定会感觉脑子雾蒙蒙的,那么我们先以举一个例子,来给这朦胧大致勾勒出一个画面,在此之前,先介绍一个名词虚函数,(要注意与虚拟继承区分)重定义: 重定义(隐藏)只要求函数名相同(但要符合重载的要求,其实两者实际上就是重载);重定义下:在这种情况下,如果通过父类指针或引用调用函数,会调用父类的函数而不是子类。重定义(或称为隐藏)发生的原因是因为函数名相同但参数列表不同,导致编译器无法确定调用哪一个版本的函数。
2024-07-27 15:52:14
1031
原创 c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
2024-07-25 22:45:02
921
原创 c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
2024-07-20 15:18:49
1058
原创 priority_queue的使用与模拟实现
使用vector作为底层容器,内部构造大堆结构。使用vector作为底层容器,内部构造小堆结构。方式三:不指定底层容器和内部需要构造的堆结构。注意: 此时默认使用vector作为底层容器,内部默认构造大堆结构成员函数功能push()插入元素到队尾(并排序)pop()弹出队头元素(堆顶元素)top()访问队头元素(堆顶元素)size()获取队列中有效元素个数empty()判断队列是否为空swap()交换两个队列的内容int main()q.push(3);
2024-07-19 15:14:45
975
原创 stack与queue的介绍与使用与实现
栈(stack)是一种遵循先入后出(FILO)逻辑的线性数据结构。其只能从容器的一端进行元素的插入与提取操作。我们可以把他比作串串,我们在串肉的时候都是从底依次往上串肉,然后在吃的时候是从串顶依次向下吃,将串上的肉比作各种类型的元素(如整数、字符、对象等),串子比作适配器容器,就得到了栈这种数据结构。如图所示,我们把容器内元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫作“入栈”,删除栈顶元素的操作叫作“出栈”。(图片取自hello算法)
2024-07-18 18:23:52
820
原创 c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
2024-07-17 19:02:16
790
原创 c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
2024-07-06 20:10:32
707
原创 关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
2024-07-06 12:06:36
1090
原创 vector与list的简单介绍
vector是表示大小可以变化的数组的序列容器。就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。在内部,vector使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组才能增大大小,这意味着分配一个新数组并将所有元素移动到该数组。
2024-07-04 22:46:57
1081
原创 c语言的烫烫烫烫烫??
当初学习C语言时,对于一些特殊的打印输出可能会感到困惑,比如会出现一堆乱码烫烫烫的情况。这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。但是学的比较深的同学就会里面反应过来这个代码其实是有问题的,因为在字符数组里面,最后一位没有存储''\0'',所以在打印的时候不会遇见特殊结束标识符,不会停止打印;
2024-07-02 22:25:52
314
原创 力扣第一道困难题《3. 无重复字符的最长子串》,c++
首先我们看到这个题是肯定有一种暴力的硬解思路的,那就是将两个vector直接链接起来,然后再排序后,直接返回中间值,这个方法实现起来还是非常容易的,
2024-06-29 22:41:26
1025
原创 c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
2024-06-01 20:56:08
1105
2
原创 c++的类(附含explicit关键字,友元,内部类)
c++作为一个面向对象的高级编程语言特点就是:封装,继承,多态。其中封装这一特点的体现就是类。在c++中的设计中,属性和行为写在一起,表现事物,也就命名为类class 类名{ 访问权限: 属性/行为 };
2024-05-19 14:20:28
616
2
原创 c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
2024-05-18 20:21:46
875
原创 贪吃蛇(c实现)
wprintf(L"您主动结束游戏\n");break;wprintf(L"您撞到墙上,游戏结束\n");break;wprintf(L"您撞到了自己,游戏结束\n");break;//释放蛇身的链表free(del);color(15);wprintf(L"不能穿墙,不能咬到自己");wprintf(L"用 ↑.↓.←.→ 来控制蛇的移动");wprintf(L"按F3加速,F4减速");wprintf(L"按ESC正常退出游戏,按空格暂停游戏");
2024-05-12 22:38:29
1293
9
原创 英文文档阅读学习atoi
然后,从该字符开始,接受一个可选的初始加号或减号,然后跟随尽可能多的十进制数字,并将它们解释为一个数值。④如果字符串str中第一个非空白字符序列不是有效的整数,或者如果不存在这样的序列,因为str为空或只包含空白字符,则不执行转换,并返回零。base-10 digits——十进制数字,即0、1、2、3、4、5、6、7、8、9这10个数字。③字符串可以包含形成整数的字符之后的其他字符,这些字符将被忽略,并不会影响此函数的行为。①解析C字符串str,将其内容解释为整数,并将其作为int类型的值返回。
2024-04-28 13:41:40
311
1
原创 c语言——二叉树
二叉树的概念在这里就不进行过多的赘述,那么主要说一下我认为重要的部分,第一点就是二叉树里面部分概念的理解:就比如说,你对于如何构建二叉树,掌握的十分深刻,但刷题的时候对于一些题目所给的概念不清楚,导致看不明白题目,这课不好,二叉树的概念如下图所示,其实都很简单,主要是当给他的名字时,你明不明白。还有对于满二叉树与完全二叉树。
2024-04-26 16:35:38
977
2
原创 c语言的各种排序
在学玩后,就了解完了,无论任何情况,分的结果就为分为:每组只有一个数据,那么肯定这数据是有序的,然后再将相邻的两个组进行正常排序到另一个数组,这个过程就为治,就如图上所说:8 与 4这个两个组排好后就为4 ,8 这个是有序的,同理又有一组 5,7那么这两组在进行治,结果就如图:4,5,7,8。与霍尔版本不一样的就为key的位置想象为了坑,多了一个变量存储坑的下标,下面的实现原理跟霍尔相似了,只不过right与left找到对应的位置,将这个值补到这个坑,再将right/left的位置设置为坑。
2024-04-25 21:59:05
688
原创 力扣--对链表进行插入排序--147
所以这样写是不行的,但反过来,该题的测试用例也不能完全通过, 他会有一个这样的测试用例。再力扣上运行,可想而知,肯定是不行的,会有一个超出时间限制,有一个测试用例不通过;我一开始也是完全仿照c语言数组实现插入排序的方法来的。其实现方法就是将数组部分改为对应的链表。
2024-03-31 10:53:34
588
原创 结构体类型详细讲解(附带枚举,联合)
一般结构体定义便是如下struct stu//变量成员这里的struct是必不可少的部分,而stu是我们自拟定的,里面便是填充的变量成员这个结构体就是struct stu类型的同理下面这个结构体就是struct st类型的struct st//变量成员这时候我们便可以在里面填充成员比如这样struct stint a;char b;//也可以填充这个类型的指针那么结构体定义完后,我们开始讲解怎么去使用。
2024-03-24 23:05:09
977
1
原创 链表的基础
想要了解什么是链表,我们要先知道什么是顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储这一点在通讯录的实现给出了充足的运用,然后向更深的探索,也就慢慢产生了链表。
2024-03-10 22:17:20
483
2
原创 qsort的使用与实现
int i = 0;for (i = 0;i < width;for (i = 0;for (i = 0;i < 10;
2024-03-02 16:30:54
989
3
原创 通讯录的实现(优化版:动态增长,文件保存)
本文将会用c语言实现一个通讯录的系统,并且存储若干人的信息,每个人的信息包括:姓名,性别,年龄,电话号码,住址。此通讯录系统的功能包括: 1.增加联系人 2.删除对应的联系人 3.查找联系人 4.修改联系人的信息 5.排序此通讯录 6.打印出通讯录每个人的信息为了实现这些变量,并且方便后期的处理数组大小,所以我们可以利用宏来实现这个功能。
2024-02-16 20:42:18
1122
3
原创 C语言分支和循环语句
观察这三张图就可以知道else与最后一个配对,结论就是else会与上方与自己最近的并且未配对的if进行配对还有一点就是嵌套就是if里面加if else 不多赘述还有补充的就是switch(表达式)//表达式不可以为浮点数case后要加break。
2024-01-23 21:21:25
333
1
原创 牛客基础语法题(中等难度与部分简单难度)(上)每道题后面全有题目链接
本题没有过多要求,乍一看以为不简单,其实不然,这题只要想明白两坐标之间的关系就迎刃而解了,细看不难发现x与x1要么相等,要么相差1,y与y1亦是如此,如果x=x1,那么y必然与y1相等,反之也成立。5 右 (第0行) 、 4 下 (第4列) 、 4 左 (第4行) 、 3上(第0列)3 右 (第1行) 、 2 下 (第3列) 、 2 左 (第3行) 、 1 上(第1列)4 右(第0行) 、3 下 (第3列)、3 左 (第3行) 、 2 上 (第0列)
2024-01-23 16:01:42
1246
3
原创 冒泡排序的讲解与一些使用案例的解析
冒泡排序就是从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。
2024-01-17 20:25:41
676
原创 我的技术之旅之初探编程
嗨,大家好!我是一个对IT充满好奇心的小白。大家可以叫我抹茶,虽然我目前对技术还不是很了解,但我热爱学习和探索新事物。我喜欢挑战自己,勇于尝试新的技术和工具。我相信通过不断学习和实践,我会逐渐成长为一名优秀的技术人员。
2024-01-16 20:54:31
398
2
原创 从原理浮点数的四舍五入问题
浮点数在计算机中存储时,小数部分也是按二进制存储的;无限循环而计算机中存储的位数是有限的,因此当变量存储不了后面的二进制小数时,再转换回十进制就产生误差了float: 单精度浮点数 十进制保存7位置,二进制保存23位0.111001100110011001100…无限循环而计算机中存储的位数是有限的,因此当变量存储不了后面的二进制小数时,再转换回十进制就产生误差了float: 单精度浮点数 十进制保存7位置,二进制保存23位0.111001100110011001100…啊,不该是输出3.16么?
2024-01-12 20:53:52
813
2
原创 栈区的非法访问导致的死循环(x64)
vs2022栈区的默认使用先使用地址的空间;后使用高地址的空间;随着数组的下标增加,地址由低到高进行访问,当越界非法访问到arr【15】时恰巧访问的为i的地址,进行arr[i]=0的操作就会使得变为死循环;通俗的解释也就是如上,(不同编译器i对应的地址不同,只是vs2022恰巧对应的为15,vs2019的为12),那么怎么用官方的话解释呢?你看画红线的地方俩者的地址为一样也就是说arr[15]就是i,那么在越界访问的时候就会越界到。arr【15】,然后改变arr【15】的值从而改变i的值导致死循环。
2024-01-07 09:25:30
407
2
原创 c语言的多组输入问题
用于从标准输入流读取数据,其如果读取成功数据,其返回的是读取到数据的个数,如果读取失败,或者读取到的为文件结束返回标志(键盘输入的为ctrl+z)则会返回EOF;那么对于多组输入的话就是利用循环进行接受,while循环,while(scanf("%d",&a));对于本题,如果没要求多组输入要求那么,代码如下。那么回归本题,多组输入代码就如下。
2024-01-04 22:05:13
623
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人