自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 C++_模板进阶

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

2024-06-08 21:21:17 670

原创 C++ priority_queue简单源码剖析:priority_queue模拟实现

被叫做优先队列优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素),其数据结构类似于大堆。优先队列被实现为容器适配器容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。

2024-06-03 23:16:42 766 1

原创 C++_deque:deque的数据结构特点

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。总得来说,deque就像vector和list的结合体,它的尾插与尾删总体上比较好,同时也能头删和头插deque的逻辑结构。

2024-06-03 11:18:41 961

原创 C++_list简单源码剖析:list模拟实现

->

2024-05-31 22:09:19 1099

原创 C++_vector简单源码剖析:vector模拟实现

没错,在C++中,内置类型可以像类一样传参初始化,当然就如原本的内置类型一样,不传参就是随机值,传了的那个形参就是参数的值。本文会模拟一个基本的vector类,帮助我们更好的理解vector的内置函数的实现与规则。,cosnt又为这个临时对象赋予常性,就可以起别名,所以这样的语法就可以通过了。这样做有什么好处呢?,我们知道,编译器在我们写了其他的构造函数时是不会生成默认构造的,

2024-05-25 11:56:10 678

原创 C++_string简单源码剖析:string模拟实现

接下来在另一个.cpp后缀的文件中一步一步的剖析实现。

2024-05-21 16:39:21 1009

原创 C++_vector操作使用

vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,所以。

2024-05-19 15:54:43 849

原创 C++入门 string类(第二章):string类对象的容量操作,string类对象访问元素,string类对象的字符串操作(查找)

这个属性与size不同,size是现有成员的个数,capacity是现有容量大小,当size = capacity时,对象会扩容。这其中的缘由是因为,vs2022一开始是在栈上存字符串,而扩容的操作实际上的在堆上开空间,再把字符串拷贝进去的,这是vs2022对string类优化的一种方式。:在vs2022有点需要注意,对于长度不大的string类对象,其字符串是建在栈上的,长度大的string类对象是建在堆上的。分别返回string的尾字符和头字符,这两个函数返回的是引用,是字符本身。

2024-05-10 20:53:35 611

原创 C++入门 string类(第一章):string类对象的构造,string类对象的访问即遍历,string类对象的增与删

总结:6. string是表示字符串的字符串类7. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。8. string在底层实际是:basic_string模板类的别名,typedef basic_stringstring;9. 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;库里string类对象的构造方法:strin

2024-05-06 23:33:12 656

原创 C++入门:模板(初阶)

对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,用不同类型的参数使用函数模板时,称为函数模板的实例化。模板是一种与类型无关的通用代码,实现代码复用,编写这样的代码又称作。类模板实例化与函数模板实例化不同,模板是泛型编程的基础。

2024-04-24 19:35:28 321

原创 C/C++入门 内存管理

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。

2024-04-24 08:50:20 651

原创 C++入门 类和对象:深入构造函数,static成员,友元函数

class Apublic://单参数A(int x )//....A test = 3;内置类型是无法直接赋值给自定义类型的,那么A test = 3;是如何成立的?这其中就存在隐式类型转换:内置类型3先隐式类型转换,调用A的构造函数先创造一个临时对象,再通过拷贝构造,将临时变量拷贝给test。当然要特别注意,因为A类具有单参数的构造函数,所以可以支持这一行为。class Apublic://....int main()//多参数隐式类型转换要用{ }

2024-04-20 23:33:16 1031

原创 C++入门 类和对象:赋值重载,const成员,取地址及const取地址操作符重载

此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符。在类中,用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝(类似默认拷贝构造)。日期类的实现不仅是完整的实现其成员变量和成员函数,也要全套设计其运算符重载。此后所有的前置或后置类型符号的重载,都形似前置++和后置++的方式区分。我们知道,类是不能用符号直接进行比较的,但如果要用 运算符。我们知道,无论是前置++还是后置++,其所用的运算符都是。上文介绍了前三个默认成员函数,本文会介绍剩下三个,

2024-04-17 21:43:43 827 1

原创 C++入门 类和对象:构造函数,析构函数,拷贝构造

同时说明:传入自定义类型作为参数(参数非引用)时,是又创建了个临时类,再调用这个临时类拷贝构造,以你传入的参数作为拷贝构造的参数的。析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用。拷贝构造也是一种构造函数,但其构造的形式是以拷贝的方式进行。调用构造函数,这里Date的构造函数是使类的属性初始化。,需要注意的是,构造函数虽然名称叫构造,但是构造函数的。,创建类类型对象时由。

2024-04-17 16:12:24 688 1

原创 初识C++类和对象

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量 称为类的属性或成员变量;类中的函数 称为类的方法或者成员函数。成员函数如果在类中定义,编译器可能会将其当成内联函数处理。//类的属性//类的方法//入栈代码void pop()//出栈代码int top()//返回栈顶元素int size()

2024-04-07 16:33:03 907

原创 C++:内联函数inline,auto关键字,基于范围的for循环,nullpter

auto为一个新的类型指示符,auto修饰的变量,是具有自动存储器的局部变量,能自动识别被赋的值的类型而为其赋值。auto声明的变量必须由编译器在编译时期推导而得。int a = 10;return 0;注意!使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

2024-04-05 21:44:37 640 1

原创 C++:函数重载,引用

而是给已存在变量取了一个。

2024-04-01 23:59:03 1033 1

原创 C++:命名空间namescape,缺省参数

namescape(关键字) name(命名空间名) { }// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型/结构体int val;

2024-03-28 22:36:35 523 1

原创 C语言:冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,归并排序,计数排序

最好情况 : O(n)最坏情况 : O(n^2)稳定性:稳定。

2024-03-25 19:43:13 827 2

原创 C语言:编译和链接

程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的.i⽂件来确认。⼀个C语⾔的项⽬中可能有多个 .c ⽂件⼀起构建,那多个 .c ⽂件如何⽣成可执⾏程序呢?举个例子,在⼀个C的项⽬中有2个.c⽂件( test.c 和 add.c )。在ANSI C的任何⼀种实现中,存在两个不同的环境。

2024-01-29 15:50:55 802

原创 C语言:C语⾔内存函数

用于移动一个内存块到另一块内存块,在同一个数组中,源内存块和⽬标内存块是可以重叠的。喜欢的话点个👍吧!,拜托了,这对我真的很重要!其复制时会判断情况:(不在同个数组时,其用法与memcpy一致)- 用于直接设置一段内存为相同的数,一般用于初始化。- 用于拷贝(复制)数组到另一个数组里。- 用于比较两段内存(数组)

2023-12-25 23:01:11 876 1

原创 C语言:深入了解指针(3)

在指针的类型中我们知道有⼀种指针类型为字符指针 char* ;一般使用于:指向单个字符变量当然还有一个使用:指向字符串变量这里有几点说明:字符串其实就是字符数组,可以使用访问数组的元素的方式访问字符串《剑指offer》中收录了⼀道和字符串相关的笔试题,进一步说明字符指针:总结:数组指针变量 是一个指向数组的指针,指针数组变量是 一个存储指针的数组示例:int *p1[10]中, p1 先与 [10] 结合,声明其是一个数组,在与 int * 结合,声明其里面的元素类型为 int

2023-12-24 16:34:54 745 1

原创 C语言: 深入理解指针(2)

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。有了前⾯知识的⽀持,再结合数组的特点,我们就可以很⽅便的使⽤指针访问数组了。正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。整个数组的地址和数组⾸元素的地址是有区别的,但我们实际中比较难感受出来。:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

2023-12-15 12:21:17 916

原创 C语言: 详细讲解动态内存管理

C/C++程序内存分配的⼏个区域:栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。分配⽅式类似于链表。数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。代码段。

2023-12-12 17:24:34 829

原创 C语言: 自定义类型-结构体详解

1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以 选择其他类型。2. 位段的成员名后边有⼀个冒号和⼀个数字。⽐如:struct Aint _a:2;int _b:5;int _c:10;int _d:30;A就是⼀个位段类型。3.2。

2023-12-04 00:26:00 941

原创 C语言: 数据在内存中的存储

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为。

2023-11-28 10:03:42 852 3

原创 C语言: 深入了解指针(1)

如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006FFD70,这个数值有时候也是需要 存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?,在语法上加了限制,只要我们在代码中对n就⾏修改,就不符合语法规则,就报错,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。

2023-11-27 08:39:49 783 1

原创 C语言: C的char类型溢出问题

30044。

2023-11-26 16:49:37 1535 2

原创 css入门学习笔记(持续迭代)

3.font-size/line-height: 字体大小/行高。font:bold italic 12px/1.5em "宋体";用法为用ps 量取字体的“高”,再进行输入。中文的字体 和 多单词的字体 要引号括住。font-family: "仿宋";如果将其设置为div模板的高度。Justify:当段的长度超出。用于下划线 上划线 删除线。2em是两个父元素长度。可以实现垂直居中的效果。

2023-11-23 09:53:22 994 1

原创 C语言: 位操作符与移位操作符的详解

在了解这些操作符具体如何使用之前,我们先了解进制的概念,其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?16进制的数字每⼀位是0~9,a ~f 的,0~9,a ~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了,再令b = a^b 也就是b = a` ^b = a^a^b = a,成功给b赋予a的原值,成为b`8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,

2023-11-06 22:46:17 51

原创 分文件—— 扫雷游戏

这里的define中,TNT代表地雷的量,Y为行,X为列。init_table为初始化地雷桌面函数,mine为埋雷函数,find为查找八方的地雷数,show为展示地雷桌面,game为开始游戏函数。我们让八面的字符全部相加,每加一项,就 -‘0’将其变为数字,最后与‘0’相加,得到八面的炸弹数量,且为char类型的字符。因为我们要玩的是9X9的地雷桌面,则我们要定义11X11的地雷桌面,以保证我们在访问桌面边缘四周的地雷是不会数组越界。如图所示,我建立了三个 文件,分别是.h文件,函数.c文件,以及主文件。

2023-10-30 17:09:25 55 1

原创 分支与循环之分支

以上代码中我们会发现每个case分支在执行完后,都会带有一个break,在 switch 语句中,使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。如果年龄在45岁⾄59岁打印"中⽼年"

2023-10-23 23:01:39 41

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除