自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 模拟实现map和set

在进行data比较的过程中,find过程中,比较的是data和key、的大小,如果是set类型,那没什么好说的,但是当是map类型时,就会比较不了,可能会想到用仿函数来比较,但是如果用仿函数来比较,你怎么确定是map还是set,所以这里应该在上层map和set的过程中实现仿函数,仿函数不是用来比较的,而是取出value里面的值的,这里面主要确定begin和end的的位置,并对const类型的目标或者非const类型的目标接收和返回。map和set是实现的红黑树的复用。下面是在红黑树里对迭代器的套用,

2025-11-21 17:37:51 226

原创 set和map的使用

关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。⽀持迭代器就意味着⽀持范围for,set的iterator和const_iterator都不⽀持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。⽀持迭代器就意味着⽀持范围for,map⽀持修改value数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜索树的结构。,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的。

2025-11-13 12:10:39 361

原创 二叉搜索树

找N左⼦树的值最⼤结点R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的位置,都满⾜⼆叉搜索树的规则。场景1:⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆法进⼊。场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。

2025-11-12 11:39:57 901

原创 多态及相关问题

基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了vialtual修饰,派⽣类的析构函数就构成重写。下⾯的代码我们可以看到,如果~A(),不加virtual,那么delete p2时只调⽤的A的析构函数,没有调⽤B的析构函数,就会导致内存泄漏问题,因为~B()中在释放资源。

2025-11-10 19:42:36 855

原创 继承和继承与其他概念关系

继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派生类。多继承:⼀个派⽣类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前⾯,后⾯继承的基类在后⾯,派⽣类成员在放到最后⾯。⽅法1:基类的构造函数私有,派⽣类的构成必须调⽤基类的构造函数,但是基类的构成函数私有化以后,派⽣类看不⻅就不能调⽤了,那么派⽣类就⽆法实例化出对象。

2025-11-08 21:20:18 591

原创 函数模板和类模板

例中,p1指向的d1显然小于p2指向的d2对象,但是Less内部并没有比较p1和p2指向的对象内容,而比较的是p1和p2指针的地址,这就无法达到预期而错误。通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些。该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化。注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要。错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板。

2025-11-08 12:27:40 740

原创 stack、queue和priority_queue(容器适配器、仿函数的使用)

在模拟实现stack的过程中,我们只需要封装一个其他容器就可以实现,这里就需要容器适配器,用已经有的容器去实现stack需要的接口,就完成stack。过程中包含了仿函数的使用,仿函数本质上是一个对operator()的重载。5. priority_queue的使用。6. priority_queue的实现。4.queue的模拟实现。2.模拟实现stack。1.stack的使用。3.queue的使用。

2025-11-06 21:58:14 187

原创 list(带头双向循环链表)

emplace_back和emplace_front与push_back和push_front很像,只有在比如说push_back({1,2}),里面传的是自定义类型类的隐式类型转换时,不能使用emplace_back({1,2}),emplace_back(1,2)直接写这种,在这种使用上emplace_back更有效率。所以要重新封装迭代器,由于node*不能满足迭代器的需求,但每个结点之间的关联还是需要node* 的,所以重新封装node*,重载解引用、++、--等。2. list的模拟。

2025-11-05 18:13:44 717

原创 vector

获取最后一个数据的下一个位置的iterator/const_iterator。,获取第一个数据前一个位置的reverse_iterator。倍,具体增长多少是根据具体的需求定义的。只负责开辟空间,如果确定知道需要用多少空间,在开空间的同时还会进行初始化,影响size。3.对于reserve扩容的时候需要注意。reserve扩容不要使用memcpy。这个问题经常会考察,不要固化的认为,使用迭代器进行初始化构。1.vector的使用。获取最后一个数据位置的。增容的代价缺陷问题。获取第一个数据位置的。

2025-11-04 10:42:12 421

原创 c++中的string

在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()在进行拷贝构造,赋值运算符重载时可以利用已有的程序进行复用。个,不同的是当字符个数增多时:resize(n)操作时,如果能够大概预估到放多少字符,可以先通过。三种的实现方式差不多,一般情况下string。中有效字符清空,不改变底层空间大小。预留空间,不改变有效元素个数,当。来填充多出的元素空间,的底层空间总大小时,

2025-11-02 11:52:20 860

原创 C/C++的内存管理

如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因。的共同点是:都是从堆上申请空间,并且需要用户手动释放。在空间上执行析构函数,完成对象中资源的清理工作。在申请空间后会调用构造函数完成对象的初始化,在申请的空间上执行构造函数,完成对象的构造。申请空间时,需要手动计算空间大小并传递,只需在其后跟上空间的类型即可,申请和释放的是单个元素的空间,如果申请的是内置类型的空间,

2025-10-30 11:38:33 675

原创 类的实例化和this指针

再分析⼀下,对象中是否有存储指针的必要呢,Date实例化d1和d2两个对象,d1和d2都有各⾃独⽴的成员变量 _year/_month/_day存储各⾃的数据,但是d1和d2的成员函数Init/Print指针却是⼀样的,存储在对象中就浪费了。编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。VS中默认的对⻬数为8。

2025-10-11 20:35:28 228

原创 时间复杂度和空间复杂度

⼤O的渐进表⽰法在实际中⼀般情况关注的是算法的上界,也就是最坏运⾏情况。对于递归调用,调用n次时间复杂度和空间复杂度都是O(n)。中,只保留最⾼阶项,去掉那些低阶项,因为当。时间复杂度:计算程序能代表增⻓量级的⼤概。复杂度的表⽰通常使⽤⼤O的渐进表⽰法。,则去除这个项⽬的常数系数,因为当。空间复杂度:通过函数在运⾏时候。⽆穷⼤时,就可以忽略不计了。⽆穷⼤时,就可以忽略不计了。相关的项⽬,只有常数项,⽤常数。低阶项对结果影响越来越⼩,当。如果最⾼阶项存在且不是。对结果影响越来越⼩,当。

2025-08-28 22:00:37 133

原创 预处理详解

更为重要的是函数的参数必须声明为特定的类型。⽤于对数值表达式进⾏求值的宏定义都应该加上括号,避免在使⽤宏时由于参数中的操作符或邻近操作符之间不可预料的相互作⽤。在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。在编译⼀个程序的时候我们如果要将⼀条语句(⼀组语句)编译或者放弃是很⽅便的。宏参数和#define 定义中可以出现其他#define定义的符号。每次使⽤宏的时候,⼀份宏定义的代码将插⼊到程序中。当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

2025-08-23 13:32:42 722

原创 编译和链接

就是根 据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的 汇编代码⽂件。链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。多个.c⽂件单独经过编译器,编译处理⽣成对应的⽬标⽂件。链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。

2025-08-17 19:53:10 345

原创 自定义类型:联合和枚举

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合体⾄少得有能⼒保存最⼤的那个成员)。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。{}中的内容是枚举类型的可能取值,也叫 枚举常量。联合的⼤⼩⾄少是最⼤成员的⼤⼩。

2025-08-16 19:52:27 171

原创 自定义类型:结构体

所以不能对位段的成员使⽤&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是先输⼊放在⼀个变量中,然后赋值给位段的成员。⽹络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要⼏个bit位就能描述,这⾥使⽤位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络的畅通是有帮助的。3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。

2025-08-16 19:29:38 606

原创 数据在内存中的存储

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。

2025-08-16 12:51:49 260

原创 memcpy、memmove和strstr等的模拟实现

memcpy本身是不需要对于一个数组里面的dest和src有重叠的copy问题进行处理的,但memcpy也可以处理这样的问题,相当于60分及格就可以,但是完成了100分。memmove就是在dest和src有重叠的copy问题进行处理的时候更能显示它的价值。strlen,strcpy,strcmp,strcat的模拟。2.memmove的模拟。1.memcpy的模拟。3.strstr的模拟。在字符串里面找字符串。

2025-08-11 23:33:51 165

原创 数组和指针

数组:指针:sizeof:strlen

2025-07-28 16:45:31 163

原创 拷贝构造 类型转换 友元以及static

• 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这 个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。• 引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始 化,否则会编译报错。

2025-03-19 17:24:23 425

原创 拷贝构造以及赋值运算符重载

像Stack这样的类,虽然也都是内置类型,但 是_a指向了资源,编译器⾃动⽣成的拷⻉构造完成的值拷⻉/浅拷⻉不符合我们的需求,所以需要 我们⾃⼰实现深拷⻉(对指向的资源也进⾏拷⻉)。6. 传值返回会产⽣⼀个临时对象调⽤拷⻉构造,传值引⽤返回,返回的是返回对象的别名(引⽤),没有产⽣拷⻉。3. 没有显式实现时,编译器会⾃动⽣成⼀个默认赋值运算符重载,默认赋值运算符重载⾏为跟默认拷⻉构造函数类似,对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的赋值重载函数。

2025-03-13 11:37:40 938

原创 文件的一般操作

1. 文本文件读取是否结束,判断返回值是否为 EOF ( 例如: fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL . fgetc ),或者 NULL ( fgets )数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 或者输出内容的文件。feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

2025-02-25 11:33:23 366

原创 构造函数和析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的, 函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对 象中资源的清理释放⼯作。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并 不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化 对象。5. 跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会 调⽤他的析构函数。

2025-02-07 08:43:47 376

原创 nullptr与inline

不论采取何种 定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的 f(int*)函数,但是由于NULL被定义成0,调⽤了f(intx),因此与程序的初衷相悖。inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

2025-02-06 21:09:41 193

原创 c++第一课

引用的使用有很多种,引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。这样⼀些场 景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对 象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。

2025-01-15 11:39:49 696

原创 回忆扫雷游戏

打印棋盘的时候,前面初始化的时候,用的是11*11,打印棋盘的时候只需要打印9*9,而且在这个过程中,9*9的数组应该是数组下标在1到9的行和列。之后就是排雷的过程,也是整个程序最精彩的部分,对于前面的部分我们只需要明确步骤就可以,在排雷的过程中涉及到了计算周围雷的数量以及'0'-'0' = 0等相关的问题。之后就是对整个游戏最重要的游戏这一过程的编写,我是通过创建两个二维数组,来模拟两个游戏的页面的,由于需要布置雷和显示周围雷的个数,所以选择两个二维数组。它包含了具体的函数实现、变量定义等实际的代码。

2024-10-16 13:48:20 498

原创 C语言分支循环语句

while语句,对于while语句来说,while后面括号中的表达式值为0循环结束,值为非0,继续执行。不许存在,当然,在省略的时候也会出现不同的问题。中,当分支包含多条语句时需要用大括号,另一方面,在分支当中可以嵌套语句,无论是在if还是在else下都可以嵌套语句,当出现悬空else的时候,记住一条else只与离他最近的if匹配,在if语句中常常用到关系操作符、条件操作符、逻辑操作符等。分支语句中的另一种语句是switch语句,在switch语句中,常常用到,case、break、default。

2024-09-11 20:21:43 586 1

空空如也

空空如也

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

TA关注的人

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