- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 C++:map和set重点解析
摘要:本文介绍了C++中的关联式容器,包括set、map和multiset。关联式容器通过key建立数据间的逻辑关系,查找效率为O(logN)。set容器基于红黑树实现,具有排序和去重功能,key不可修改。map存储键值对,支持下标访问,value可修改。multiset允许存储重复key值,提供了count、equal_range等函数操作相同key的元素。文章详细讲解了这些容器的特性、底层实现和常用操作,如insert、operator[]等。
2026-01-07 18:17:58
373
原创 【C++】继承:菱形继承
本文探讨了C++中的多继承问题,重点分析了菱形继承带来的数据冗余和二义性问题。通过示例代码展示了单继承、多继承和菱形继承的区别,解释了数据冗余和二义性的产生原因。文章详细介绍了虚继承的解决方案,包括虚基表指针和偏移量机制的工作原理,并通过内存分析比较了普通继承与虚继承的内存差异。最后指出多继承的复杂性,建议优先使用组合而非继承,以降低耦合度。文章强调C++语法复杂,菱形继承应谨慎使用,提倡"高内聚、低耦合"的编程原则。
2025-09-29 17:03:53
778
原创 【C++】:继承全面解析
本文介绍了C++中继承机制的核心概念和使用方法。主要内容包括:1. 继承的基本概念,通过提取student和teacher类的公共成员创建person基类,实现代码复用;2. 继承的三种方式(公有、保护、私有)及其对成员访问权限的影响;3. 派生类和基类的赋值转换规则(派生类可向基类转换,反之不行);4. 继承体系中的作用域问题,包括同名成员和函数的隐藏规则;5. 派生类中默认成员函数(构造、拷贝构造、赋值重载、析构)的实现要点;6. 继承与友元、静态成员的关系。文章通过代码示例详细说明了继承的语法和使用注
2025-09-27 19:59:23
880
原创 【C++】:模板进阶
本文介绍了C++模板进阶知识,主要包括:1. 非类型模板参数:允许在编译期指定常量值作为模板参数,使模板更灵活;2. 模板特化:为特定类型提供定制实现,包括函数模板特化和类模板特化(全特化/偏特化);3. 模板分离编译问题:分析模板定义与声明分离时产生的链接错误原因,建议将模板定义放在头文件中解决。文章通过具体代码示例展示了这些特性的应用场景和使用方法,同时指出了模板的优缺点,如代码复用性强但可能导致编译时间增加等问题。
2025-09-26 21:41:18
674
原创 【C++】:stack、queue和deque全面讲解
本文介绍了C++标准库中的三种容器适配器:stack、queue和deque。stack是后进先出(LIFO)结构,queue是先进先出(FIFO)结构,二者都是通过封装底层容器实现功能。文章详细讲解了它们的使用方法、模拟实现,并分析了其优缺点。deque作为双端队列,是stack和queue的默认底层容器,文章解释了其分段存储结构、迭代器实现以及为何被选为默认容器的原因。通过对比vector和list的特性,说明了deque在两端操作效率与内存利用率上的平衡优势。
2025-09-25 21:00:48
825
原创 【C++】:list的模拟实现,带你手把手了解底层设计
希望文章能对你有所帮助,有不足的地方请在评论区留言指正,一起交流学习!本篇博客将模拟实现STL中的list,当然,不是为了写出更好的list,只是让大家深刻的理解其底层的实现。
2025-09-24 19:13:49
889
原创 【C++】:list容器全面解析(超详细)
listlist的底层是双向循环链表,每个元素以 “独立节点” 形式存在,节点间通过指针关联,内存中不连续存储。
2025-09-12 15:20:24
1133
原创 C++:迭代器失效问题(vector为例)
vector迭代器失效源于连续内存特性:扩容导致所有迭代器指向旧内存(物理失效),删除元素导致pos及之后迭代器逻辑错位(逻辑失效);需通过‘重新获取迭代器’或‘用erase返回值更新’规避,对比list可凸显连续内存与非连续内存的设计差异。如何在平时使用stl中避免迭代器失效报错:1.如果执行了可能触发扩容的操作(如push_backinsert),不要复用之前保存的迭代器,必须通过begin()end()等接口重新获取。2.erase(pos)指向 “被删除元素的下一个有效元素” 的迭代器。
2025-09-11 22:08:31
1310
原创 C++:模拟实现vector的问题
在模拟实现vector的时候,出现了好多的问题,因此在本片博客中主要记录分析本人出现的错误,加深巩固基础机制。本片博客比较潦草,算是笔记,以我的代码写作过程记录出现的问题。
2025-09-11 16:58:35
733
原创 C++:深入剖析vector
Vector 是 C++ 标准模板库(STL)中一种非常重要的序列容器,它本质上是一个能够动态增长和缩小的数组,在内存中连续存储元素。因为它封装了内存管理,所以使用起来比原始数组更灵活、更安全。构造函数接口说明vector()无参构造构造并初始化n个val拷贝构造使用迭代器进行初始化构造注意:vector是模板类,创建新的对象的时候需要显示实例化。1.默认构造:创建空vector2.数量初始化:创建10个元素,每个初始为0103.指定值初始化:创建10个元素,每个都是1。
2025-09-06 21:00:37
1066
原创 C++:String类的模拟实现
希望文章能对你有所帮助,有不足的地方请在评论区留言指正,一起交流学习!本篇将会对重要的成员函数编写模拟实现string类,加深对string类的理解。简单的成员函数不会做过多的描述,复杂情况下,会描述思路以及容易出的错误;会介绍浅拷贝可以实现的函数。
2025-08-23 17:14:11
922
原创 string类
standard template libaray 标准模板库,简写为STL;起始C++标准库的组成部分,STL 实现了数据结构和算法的标准化,提高了代码的复用性、可维护性和效率,开发者可以直接使用其中的组件,无需重复开发。1.字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型。
2025-08-14 17:30:33
593
原创 C++模板初阶
函数模板是一种能创建通用函数的工具,它可以处理不同的数据类型。借助模板参数,函数模板能够对类型进行参数化,从而实现代码的复用。函数模板格式。
2025-07-28 20:28:21
989
原创 C++ 内存管理
下述代码是new对于自定义类型的使用。class Bpublic://构造函数:_b(b)_count++;// 拷贝构造函数_b = b._b;// 析构函数~B()_count--;_b = 0;int main()//只是开辟了一块承载B的空间free(ptr1);//开辟空间的同时会调用类初始化函数//访问方式和结构体一样,在C++中二者大致一样,区别仅在于默认访问控制//消除对象的同时会调用析构函数。
2025-07-28 15:46:25
1076
原创 C++类和对象(三)
静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区;所以在创建的类的时候静态成员就已经初始化了;因此不要将其和普通的成员变量混淆,静态成员变量输出类的本身,其他的成员变量是蓝图。所以其定义的时候要在类外定义,不参加对象的初始化。当然静态成员函数也是受访问限定符限制的。静态成员函数:静态成员函数没有this指针,不能访问任何非静态成员,包括函数非静态成员的函数以及普通的成员函数。如下:随便创建的空函数,也是不可以访问或者复用的。3. 友元。
2025-07-26 22:49:58
957
原创 Linux环境搭建与以及常见指令
Linux开源的好处:免费、稳定、安全、快速、高效。被更多的专业人员使用。目前的安卓系统是由Google公司投资并研发的,其源于Linux内核。应用场景:互联网公司的服务器后端、智能设备中的使用(手机、智能手表等等)、以及嵌入式场景。Linux的版本分为内核以及商业化版本;很好区分,有自己logo的就是商业化版本,没有logo只有一串版本代号的就是Linux的内核。Linux 内核是操作系统的核心组件,负责管理硬件资源(如 CPU、内存、存储设备等)、提供进程调度、文件系统管理、网络通信等底层功能。
2025-07-13 17:02:43
404
原创 C++类和对象(一)
(1)类的定义类是创建对象的蓝图或模板,它定义了一组属性(变量)和方法(函数)的集合。类本身不产生实际数据,而是作为一种数据类型的抽象定义。在C++中结构体升级为类,其中可以包含了变量和函数;可以当作数类型来创建变量。(2)对象的定义对象是类的实例,通过类创建。每个对象都有自己独立的属性值,但共享类定义的方法。对象就是通过类实例化的过程;每个对象都有独特的实例,具有唯一性举个例子:在C语言中可以使用结构体将一组不同类型的数据封装在一起;在C++中struc也可以用来封装函数。
2025-07-13 16:50:09
883
原创 C++入门(笔记)
缺省参数不能在函数声明和定义中同时出现声明和定义在同一个文件中,且声明和定义出现在调用函数之前的情况,下方。C++ 编译器按顺序处理代码,每个.cpp文件是一个独立的编译单元。当编译器遇到函数调用时,它需要知道:函数的签名(参数类型和返回值)是否有默认参数如果函数定义(带默认参数)出现在调用点之前,编译器可以直接从定义中获取这些信息,因此声明可以省略(或者声明中可以不写默认参数)。#include <iostream> // 其中包含stdio和stdlib//声明//定义。
2025-06-28 22:31:20
1204
原创 C语言笔记数据结构(链表)
判断的遍历循环的结束条件是tail->next->next!= NULL,循环结束的时候 tail指向的是倒数第二个结点,将tail指向的这个结点的tailnext=NULL,就可以将最后一个结点和之前结点的指针连接断开。当然在删除掉结点的时候一定要将结点申请的空间释放掉,需要的是指向内存的的指针,即要在置为NULL之前使用,防止内存泄漏。
2025-03-29 12:54:50
1363
9
原创 C语言数据结构之顺序表
数据存储在内存中;计算机是如何调取数据并显示在屏幕上的;如何对内存中的函数进行增删查改呢?依靠数据结构对数据进行调用和修改。若有错误,请各位指正。
2025-03-09 16:04:00
1111
4
原创 C语言数据结构之复杂度(时间复杂度和空间复杂度)
算法的时间复杂度是一个函数;一个带有未知数N的表达式,N是程序中未知量的数值;算法所花费的时间和执行次数成正比;因此算法中的基本操作的执行次数就可以当作算法的时间复杂度。举例:计算出示例1中基本操作的执行次数和N之间的数学表达式(函数),也叫做时间复杂度。示例1// 请计算一下Func1中++count语句总共执行了多少次?i < N;++ i)j < N;k < 2 * N;int M = 10;++count;++count。
2025-03-08 12:27:39
974
3
原创 C语言笔记(文件操作)
之前程序运行的数据存放在内存中;一旦关闭程序、或者设备掉电数据将丢失,无法保存;而文件可以保存程序运行过程中键盘输入的数据,以及程序产生的数据,程序将数据写入到相关的文件中(.txt文件)达到长期保存的目的。本篇博客将会介绍文件的类型、文件在程序中命名、打开文件函数和关闭文件的函数、按顺序和随机读写文件的函数,以及读文件结束的判定。
2025-02-27 11:07:27
735
1
原创 C语言笔记(动态空间的内存管理)
malloc函数申请的函数空间不会初始化,calloc申请的函数空间会初始化,realloc申请的空间是在malloc和calloc空间后面的追加,free配合前面的三个函数使用。动态内存函数所设计到的操作系统的设置我不会啊,所以没有能力模拟函数实现。
2024-11-28 21:54:36
1103
原创 C语言笔记(自定义类型:结构体、枚举、联合体 )
/方式1 创建结构体的时候创建全局变量int x;int y;}a1;//方式2//方式3int main()return 0;初始化和和数组的初始化较为相似,是应用{ }来初始换结构体创建的变量,在后面附上值就可以了,完全初始化,int x;int y;不完全初始化(一个一个的给变量赋值)int x;int y;int z;char ch;float d;访问int x;
2024-11-23 22:57:11
1131
原创 C语言笔记(字符串函数,字符函数,内存函数)
本文重点叙述字符串函数和内存函数,字符函数的使用简单并且较好理解,顺带一提字符函数。内存函数会列举四个 memcpy,menmove,memcmp,memset,重点放在字符串函数中。学习函数基本作用,并模拟函数是如何实现的,可以更好的理解函数。若有错误,请各位批评指正。
2024-11-10 22:06:49
1216
原创 C语言笔记(指针题目)例题+图解
本文分为两部分 ,第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析,第二部分是一些笔试题目。若有错误,请批评指正。
2024-10-26 21:30:31
959
原创 C语言笔记(指针进阶)
字符串和数组本质上是差不多的,都是在内存中连续存储的。数组指针——存放数组地址的指针—指向数组的指针,指向的整个数组,因此数组指针是一个指针。上述&arr+1跳过的是整个字符,因此&arr取出的指针,指向的是整个数组。浮点型指针—存放浮点型地址的指针—指向浮点型的指针 float*字符指针—存放字符地址的指针—指向字符的指针 char*整型指针—存放整型地址的指针—指向整型的指针 int*结论:&数组名是整个数组的地址,数组名就是首元素的地址。指针指向是字符串首个元素的地址。指针数组是用来存放指针的数组。
2024-10-18 22:20:11
839
原创 点亮一个LED(51)+(独立按键控制LED亮灭)
二极管有单向导电性,有阳极和阴极之分 上述左侧式插件式LED ,长的引脚是阳极,左侧是贴片式的带色的一端是阴极,箭头指向是阴极。阳极就是接电源,阴极接地。电流大小一般在3-20ma之间,再大的容易烧坏二极管。二极管的亮度和电流的大小有关,自身带有导通压降1.7V。
2024-10-17 21:34:09
1231
原创 C语言笔记(数据的存储篇)
char // 字符数据类型short // 短整型int // 整型long // 长整型long long // 更长的整型float // 单精度浮点型double //双精度浮点型在这里就不说不同数据类型在内存中所占数据类型大小了。C语言中数据类型的意义1.使用数据类型开辟内存空间的大小2.如何看待内存空间的视角。charunsigned char //字符在存储的时候存储的是ASCLL码值A,ASCLL是整数,signed char //所以在归类的时候,字符属于整型家族。
2024-10-16 21:19:50
1307
原创 C语言笔记(操作符篇)
负数的原码、反码、补码是要经过计算的,反码的符号位不变,其他位按位取反,就是反码;按照一个数的正负直接写出的二进制表示的形式得到的就是原码,但是移位操作符应该作用在补码上,补码才是内存中的形式。特殊的情况就是字符串的命名和数组名,两者不用取地址符号,使用打印%p就可以输出数组或者字符串首个元素的首地址。& 按位与 在补码的基础上进行与的操作,全1为1,有0为0。2. % 操作符的两个操作数必须为整数,返回的是整除之后的余数。3.a
2024-10-04 17:44:10
1439
原创 C语言笔记(数组二)三子棋
目录1.游戏介绍2.设计思路3.程序的实现3.1主函数编写3.2 test()函数编写3.3game()函数编写3.3.1 test()函数整体逻辑3.3.2 init_board()初始化棋盘3.3.3 print_board( )初始化棋盘3.3.4 player_mover( ) 玩家下棋3.3.5 computer_move( )电脑输入3.3.6 is_win( )判断输赢编写 规则:游戏双方对战,双方依次在9宫格棋盘上摆放棋子,分为'X'和'O'两种。代码存放处这个是我编写的程序
2024-09-27 22:55:12
822
原创 初始C语言(简单的入门篇)
本文主要是有关C语言的基础知识,详细请看目录,可以让初学者看懂简单代码。C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
2024-09-26 16:03:01
2627
原创 C语言笔记(函数篇二)函数递归
程序员用自身的编程的技巧为递归。递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。return 0;上述就是一个简单的递归的例子,主函数main在程序中调用了自己,但是这个程序缺少了递归的一个要素:结束递归的限制条件。没有结束的限制条件其结果必然就是无限递归,知道栈溢出,栈区无法再次新开辟main函数的栈帧,栈区使用完之后,程序无法继续运行出现的结果如下图。画图解释一下 如图(画的不好啊,将就看一下啊)。
2024-09-23 21:20:28
1189
原创 C语言笔记(函数篇一)
库函数的功能有限,自定义函数是程序员最大的发挥空间。1.自定义函数的组成1 ret_type fun_name(形式参数)2 {34 }• ret_type 是函数返回类型• fun_name 是函数名• 括号中放的是形式参数• {}括起来的是函数体2.举例找两个整型数据的最大值的自定义函数。a : b);// 判断a>b是否成立,大于返回值为a,小于返回值为bint main()int a = 0;int b = 0;//ret来接受自定义函数的返回值。
2024-09-22 16:23:20
1750
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅