- 博客(33)
- 收藏
- 关注
原创 C#:为什么在多线程环境中操作委托是线程安全的? c的函数指针=>C#委托进化过程详解
委托其实很好理解,使用也很简单.就是一个c语言函数指针的进化体
2024-08-07 17:59:38
1260
1
原创 C#:具体类=>抽象类=>接口的变化过程详解
abstract抽象类 :为复用而生,不能实例化,专门作为基类,未完全实现逻辑的类(方法没实现全)而interface接口是完全未实现逻辑的类,纯虚类,只有函数成员,且都为public
2024-08-06 14:55:08
1139
原创 c++:刷题必备 容器map的使用
map的迭代器使用和vector等容器类似.但是因为map里面存储的是键值对,所有打印起来比较麻烦.iterator则返回key值所在的节点的迭代器.我们取得这个迭代器,然后返回value的引用.e相当于键值对的引用.这个的底层和上面类似.只不过在书写方面简单一些.operator[]是map里面内置的最强的函数,在我们刷题时帮助巨大.key是first,value是second,这里是按照存储顺序排列.比如上面Key是string,T是string.
2024-05-12 10:56:29
1232
原创 c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现
二叉搜索树的插入和查找不难,但是它的删除细节很多,分类很细,一不留神容易掉坑里面,面试也经常会考.大家如果不懂的话,要多看几遍.
2024-05-10 21:22:40
873
3
原创 c++:刷题必备--容器set的使用.功能:查找,去重和排序.
set的使用其实很简单.它的底层是一个自平衡二叉树,也就是AVL树和红黑树,我们只需要通过中序遍历(左子树 根 右子树)递归下去.根的左子树永远比根的值小,根的右子树永远比根的值大.因为它的底层是一个自平衡二叉树,它本身就是有序的.我们不断的插入值,它就会生成一个二叉树.这个二叉树与其他普通二叉树不一样,查找这个函数跟调用其他函数一样。
2024-05-09 23:14:11
611
原创 c++:优先级队列(priority queue)使用及底层详解,附带仿函数初步使用
其次在面对商品等复杂类型中,需要我们根据价格,评价,销量等等进行排序时.单靠商品类里面的一个操作符重载小于或者大于是不够的,我们可以写多个仿函数,争对价格,评价等进行比较.首先我们可以自己控制大堆/小堆.2+1,右孩子=父亲节点。
2024-05-05 16:17:57
866
原创 c++:数据结构链表list的模拟实现
其实还有另一种解决方法,copy这个类,把这个类改成const版本的.但是这样会造成代码冗余.在调用上,我们假设有一个类A,里面有两个值a1和a2,我们用这个类来充当节点中的数据val。Ref是引用,Ptr是指针.这样子写是为了能生成多种引用T&,和T。这个类里面封装的是节点的指针,所以它唯一的成员变量就是Node。it->是调用it.operator->(),返回的是一个T。这个函数的功能和构造函数一样,写出来是为了后面进行复用.首先T是节点数据的类型,这个没问题.这里的模板有三个参数,为什么呢?
2024-04-24 15:16:56
1868
原创 c++数据结构:string的模拟实现
private:为了避免和std里面的string起冲突,我们自己搞一个命名空间string本质上来说就是一个字符数组。
2024-04-13 17:15:40
526
原创 c++:类和对象中:拷贝构造和赋值运算符重载详解
拷贝构造,顾名思义就是复制.我们把一个已经创建自定义对象初始化创建新对象.赋值运算符重载是把一个对象赋值给另一个对象,二者都是已创建的.比如在Date这个类里面就是Date&.为什么一定要是引用呢?我们都知道,函数的参数是一个形参,我们调用函数传过去的才是实参.而形参是实参的一个拷贝,我们要传值过去就必须创建一个形参.我们传自定义类型Date的值时,因为要拷贝一个新对象,所以就要调用Date类型的拷贝构造.要是拷贝构造里面的参数也是Date的话,就会继续调用它的拷贝构造.如此形成无限递归.
2024-03-13 20:25:03
1334
原创 c++: 引用能否替代指针? 详解引用与指针的区别.
新来的小伙伴如果不知道引用是什么?可以看我的上一篇文章1.引用无法改变指向,所以引用无法替代指针,引用只是能在大多数情况下简化我们的代码2.引用在语法上不占地址,指针开空间3.因为引用必须进行初始化,所以引用比指针更安全一些,容易出现野指针,不容易出现野引用4.在sizeof,++等意义不同5.有多级指针,没有多级引用c++祖师爷在设计的时候并不是想用引用替代指针,而是想方便我们的日常工作与学习.二者不是非黑即白,而是相辅相成.
2024-03-11 21:53:18
1760
原创 c++:引用&是什么?c++引用详解及使用
我们入住酒店(调用函数,开辟空间),离开酒店(销毁空间),打扫酒店房间(清理空间).但是我们在离开时不小心把行李(变量)遗落在房间里面,我们的行李很有可能被清理走了.当我们再次进入房间(再次访问这个空间),我们会发现自己的行李不见了。我们知道,局部变量c在栈区开辟,出了作用域Add就销毁.ret所接收的是一个已销毁空间的值.编译器在销毁的同时很有可能会清理空间.我们访问的是一片未知的区域.比如齐天大圣是孙悟空的别名,弼马温也是孙悟空的别名.齐天大圣被困在五行山,那么孙悟空有没有被困呢?
2024-03-05 16:44:28
595
6
原创 c++: 缺省参数/默认参数的详解及其应用
int* a;int size;int main()//确定要插入100个//要插入20个//不知道要插入多少个return 0;在我们对栈进行初始化时,如果我们确切知道要开辟的空间的大小,我们可以传具体的值.在我们不知道具体要开辟多大的空间时,我们可以不去管他.直接不传这里可有童鞋要问了,可以直接不管它的大小.等它不够再自己扩容.确实可以,但我们要认识到一点,扩容是有消耗的.原地扩容还好,异地扩容要把所有数据拷贝到新空间里,消耗不小.
2024-03-03 18:36:59
546
3
原创 c++类和对象上:构造函数与析构函数详解与使用
1.一般情况下我们都要写构造函数2.成员变量都是自定义类型或者内置类型给了缺省值可以考虑让编译器自己生成1.对象有动态开辟空间且成员变量为内置类型(指针)需要自己写析构函数.2.成员皆为自定义类型可以不写析构函数。
2023-12-27 16:32:43
939
10
原创 c++: using namespace std是什么意思?命名空间的由来和基本的输入输出
c++: using namespace std是什么意思?命名空间的由来和基本的输入输出.
2023-12-21 16:23:57
825
4
原创 leetcode刷题:138.随机链表的复制(两种思路画图讲解并附代码)
首先,我们要重新拷贝一个链表,这个听起来并不难.这道题目难的是每个节点还有一个随机指针,我们不知道它指向哪里.但是我们所要拷贝的链表必须有这个随机指针.
2023-11-15 22:19:40
995
6
原创 数据结构第一弹--realloc开辟动态顺序表讲解,代码实现与调试(画图解读)
线性表是在实际中广泛应用的数据结构.常见的线性表有:顺序表,链表,队列等等.线性表在逻辑上宿舍连续的,我们可以认为是连续的直线.但是线性表在内存存储中不一定是连续存放的.比如链表.也有可能是连续存放的–顺序表.内存存储是否连续各有优劣,没有高下之分简单来说,顺序表就是一个数据连续存放的数组.因为顺序表物理存储连续,所以我们对顺序表的访问非常方便,修改数据也相对容易,但数据表也存在问题.1.在我们进行头插/删或者是任意位置插入和删除时,我们都要挪动后面的数据,时间复杂度是O(N)
2023-11-01 10:42:47
252
9
原创 Leetcode刷题:88. 合并两个有序数组(多种方法详细解读)
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是**存储在数组 nums1 **中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n。提取主干1.
2023-10-28 14:54:36
818
8
原创 深度剖析数据在内存中的存储(包括int double类型,原码,反码,补码和电脑大小端存储的详细解释)
整形家族非常庞大,有以下几种类型大小(单位是字节)12448而这些类型又分为有符号的(signed),也就是有正负之分无符号的(unsigned).由于整型各个类型存储类似,这里我用int类型来讲解。
2023-10-25 21:34:24
159
8
原创 快排函数qsort的使用(c语言)
排序整型数组时,我们可以使用< >符号来操作,但是排列字符串,结构体呢?不同的类型有不同的排序方式,而我们需要将这个排序方式传给qsort函数.让它清楚应该怎么样排序.比较两个整型的函数的声明当e1指向的元素大于e2指向的元素时,返回大于0的数当e1指向的元素等于e2指向的元素时,返回0当e1指向的元素小于e2指向的元素时,返回小于0的数需要注意的是函数名就是函数的地址,所以在使用qsort时我们直接传 cmp_intqsort快排函数需要四个参数,1.voidbase:指明要排序的起始地址。
2023-09-26 19:19:27
131
1
原创 指针进阶(1)
首先,我们先来 对指针做一个回顾.1.我们口头说的指针是指针变量,存放的是地址,这个地址会指向内存唯一的一块区域.2.指针的大小是4/8个字节,取决与是X86/X64系统(32位/64位)3.指针是由类型的,不同类型的指针+-跨越的步长不同,另外,不同类型的指针解引用能够访问的区域大小不同
2023-09-23 20:34:53
64
1
原创 三子棋游戏教学(c语言)
i < row;j < col;j++) {数组传参传的是数组首元素的地址,所以需要传数组的行和列定义i和j,遍历让字符数组全部初始化为空格为什么要初始化为空格呢?我们需要一个字符来占领那个位置,却又不是太明显,只能是字符了.
2023-09-07 21:53:30
69
1
原创 c语言基础--指针初步讲解(入门版)
指针是学习c语言或者c++无法逃避的一个坎,很多同学就是在指针这一part道心崩溃最终放弃的.今天我将尽我所能把指针讲得浅显易懂.众所周知,内存是我们电脑运行的重要一环.我们现在的内存动不动就要16G或者32G.所以,为了更好地管理我们的内存单元,设计师将电脑划分为一个个内存单元–字节,并给他们进行编号.这些字节的编号就是这些内存单元的地址,也就是指针.存放这些编号的叫做指针变量.,这就像是小区里为了更好地管理业主的房子,给我们分配了一个个门牌号.例如门牌号是104.我可以根据这个门牌号在一个小区里精准定
2023-06-20 16:11:15
161
原创 c语言入门--#define定义常量和宏初步讲解 (适合小白学习)
define定义常量1.define定义常量的好处2.#define的作用原理3.#define的使用#define定义宏//整型 printf("M = %d\n" , M);int a = M;//字符 printf("%c\n" , CH);return 0;100//整型 printf("M = %d\n" , M);int a = M;//字符 printf("%c\n" , CH);return 0;1.常量无法修改,比全局变量安全;
2023-06-19 14:41:59
372
原创 Visual Studio 无法启动程序 系统找不到指定的文件怎么解决
首先,出现这个问题的原因是同时使用了两个main函数造成的.因为main函数相当于程序的入口,你同时有两个入口,编译器不知道要进入哪一个,就会报错.解决方法是将一个你不需要的源项目进行屏蔽:全选代码,按住ctrl键,再加键盘上面的c键和k键.或者按下方图片标注的地方。
2023-05-23 10:13:07
13087
2
原创 (c语言)进制转换,输入一个数字,其进制为以上二,八,十,十六进制四种之一,以换行结尾。
2.进行分类:二进制,八进制,十六进制都以0开头,而十进制初自然数0之外都不已零开头.再分类:二进制:以0b开头;八进制:以0开头,后面都为数字;十六进制:以0x开头.输入样例1:0x1a 输出样例1:26。十进制:包含字符0-9,且除了自然数0以外的数字不以0开头;注意:若输入为0,我们认为它是十进制数,可直接输出0。十六进制:以0x开头,包含字符0~9和a~f。二进制:以0b开头,包含字符0和1;请你将输入数字转换为十进制数字输出。八进制:以0开头,包含字符0~7;
2023-05-22 23:51:33
255
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人