- 博客(64)
- 收藏
- 关注
原创 一、C 语言初识
人与人之间需要通过语言进行信息传递和交流,世界在存在很多语言,每种语言都有不同的特点和规范,或者说约定俗成的规则。而计算机世界同样存在多种语言,例如高级语言的 C、C++、Java等。本节会讲述 C 语言中的常见概念,其中内容只做了解即可,后面都会详细介绍。在不管学习何种语言时,入门的第一个程序一般都会是,类似一种特殊的传承吧。当编译 + 运行后,程序就有了“生命”,之后显示屏上会瞬间显示。这就代表我们已经编写出了一个最简单的程序。至此我们就算迈出了学习 C 语言的第一步。int main()
2026-07-18 18:55:10
181
原创 四、常见设计模式
常见设计模式摘要 设计模式分为三大类:创建型、结构型和行为型。创建型模式关注对象创建机制,将创建与使用分离。常见模式包括: 单例模式:确保类仅有一个实例并提供全局访问点。分为饿汉式(启动即创建)和懒汉式(首次调用创建)。C++11后推荐使用局部静态变量实现线程安全的懒汉模式。 工厂模式:解耦对象创建与使用,客户端通过接口获取对象。简单工厂通过参数决定产品类型,但违反开闭原则;工厂方法将产品创建延迟到子类;抽象工厂提供产品族创建接口。适用于对象构造复杂或需动态扩展的场景。 其他模式(如原型、建造者)通过不同方
2026-07-03 10:27:28
335
原创 三、max 的使用
摘要:本文介绍了C/C++中max函数的使用注意事项。在C语言中,使用max需包含<algorithm>头文件,且比较参数类型必须相同,否则会报错;多值比较需嵌套调用。C++的std::max更灵活:支持隐式类型转换的不同参数比较,可通过initializer_list一次比较多个值,还提供带自定义比较器的三参数版本(比较两个对象)。文中通过代码示例说明了各种用法和常见错误。
2026-06-30 17:11:49
235
原创 二、仿函数
什么是仿函数(Functor)?从字面意思可以猜测是模仿函数的行为使其像函数一样被调用。仿函数(Functor)是 C++ 中一种特殊的对象,它通过重载 operator()使得对象可以像函数一样被调用。仿函数本质上是类(或结构体)的实例,但提供了函数调用的语法。
2026-06-30 17:02:11
215
原创 九、程序地址空间
例如:一个进程正常运行,但是另一个进程运行时不小心使用并修改了第一个进程的地址空间,那么第一个进程明显会崩溃报错。上图就能解释我们前面所对比的代码,同⼀个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址。例如:在栈上开辟一个数组,数组内部是从低地址到高地址的,但是开辟整个数组时是从高地址到低地址的。规定:父子中,任何一个进程,尝试对共享的变量进行修改,不能直接修改,而要发生“写时拷贝”。,这样每⼀个进程都会有⾃⼰独⽴的地址空间才能互不⼲扰。下进程的地址空间的所有的信息的结构体是。
2026-05-14 11:37:26
355
原创 六、操作系统(Operating System)
系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层用户或者开发者进⾏⼆次开发。在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,这部分由操作系统提供的接⼝,叫做系统调⽤。任何计算机系统都包含⼀个基本的程序集合,称为操作系统,即。组织起来,⽤链表或其他高效的数据结构。
2026-05-11 16:49:32
177
原创 五、冯诺依曼体系结构
处理速度极快,是**皮秒(ps)**级别,但是 CPU 的价格十分昂贵,为了尽量减少计算机的造价,通常 CPU 寄存器的容量都比较小。C/C++ 文件 => 二进制可执行程序 => 程序(程序 = 逻辑 + 数据)要运行,就必须加载到内存中(体系结构标准)。而虽然硬盘的空间十分大,成本也很低,但是其处理速度很慢,是**毫秒(ms)或微妙(us)**级别。从一个设备的数据到另一个的设备的数据,在硬件层面上本质就是对数据的拷贝。内存角度(硬件),站在加载到内存当中的正在运行的程序的角度。
2026-05-11 16:12:06
461
原创 二十三,哈希表
当key是string、Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整型,如果key可以转换为整型并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整型,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整型值不同。注意:需要给每个存储值的位置加⼀个状态标识,否则删除⼀些值以后,会影响后⾯冲突的值的查找。
2026-04-07 17:09:09
423
原创 十,进程控制
学习进程控制相关:fork,exit和_exit,wait和waitpid,阻塞和非阻塞等待,exec*系列库函数和系统调用,模拟实现简单的shell命令解释器。
2025-12-02 18:36:27
688
原创 三,Linux权限
实际是打印的字符’1’ ‘2’ ‘3’ '4’而非整数1234,所以说printf是格式化输出,cin,cout同上。2,为什么有权限:Linux是多用户操作系统,允许多个用户进行登录访问,权限可以更好的对用户进行管理。chmod 666 文件名(作用:给全部访问用户只读和只写权限,110,110,110)对于目录,起始权限是从777开始的,默认需要可执行权限,因为需要cd进入目录。1,用户访问文件的时候,确定自己相对于文件的身份角色,只会验证一次!
2025-09-01 11:03:48
1109
原创 二,Linux基本指令
原因:多叉树中,任意一个节点都只有一个父节点,从/(根目录)开始到目标文件,路径就是唯一的,这种路径也称为绝对路径。rm:删除⽂件或⽬录 ,在删除时,如果拥有管理员权限会询问,y是确认删除,n是取消删除。1,ls:查看当前目录(文件夹)下文件名,因为文件名属于文件属性,所以是显示文件的属性。9,tree:列出指定目录下的所有文件,包括子目录里的文件(默认没有安装)。12,rm:删除⽂件或⽬录 ,在删除时,y是确认删除,n是取消删除。文件=文件的内容+文件属性(文件的名字,大小,类型,权限等)
2025-09-01 10:53:41
585
原创 一,Linux环境搭建
使用云服务器不仅环境搭建简单, 避免折腾, 同时还有一个最大的好处, 部署在云服务器上的项目可以直接被外网访问到, 这个时候就和一个公司发布一个正式的网站没有任何区别. 也就能让我们自己写的程序真的去给别人去使用.。2,使用虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些bug , 会导致环境上出现各种莫名其妙的问题,比较麻烦。3,使用云服务器, 可以直接在腾讯云, 阿里云或华为云等服务器厂商处直接购买一个云服务器。
2025-09-01 10:38:51
227
原创 C++(初阶)(二十一)unordered_set和unordered_map的使用及实现
c++11template<class Key,c++17template<class Key,定义在头文件<unordered_set>Key就是unordered_set底层关键字的类型。t默认要求Key支持转换为整形,如果不⽀持或者有额外的需求可以自行实现支持将Key转成整形的仿函数传给第⼆个模板参数。默认要求Key支持比较相等,如果不⽀持或者想按⾃⼰的需求⾛可以自行实现支持将Key比较相等的仿函数传给第三个模板参数。
2025-06-15 19:52:40
493
原创 一,关键字class和typename的区别
到底是类型还是静态成员,编译就会报错,所以为了让编译器明确知道T::Type是一个类型而非静态成员,就必须加上typename。上述两种声明方式是没有任何区别的,也就是说,在声明类模板或者函数模板时,关键字class和typename的用法上没有任何区别。在c++标准模板库,也就是STL中,使用了模板,在声明类模板和函数模板时,有两种方式。其中class和typename是类模板或者函数模板中模板参数的类型。嵌套依赖类型场景,在此场景下,必须使用typename。1,class可以声明或定义一个类。
2025-05-27 18:48:31
487
原创 C++(初阶)(十九)——红黑树
对于规则4,前序遍历,遍历过程中⽤形参记录跟到当前结点的blackNum(⿊⾊结点数量),前序遍历遇到⿊⾊结点就++blackNum,⾛到空就计算出了⼀条路径的⿊⾊结点数量。比当前结点小,再去和左孩子的结点比较;3,如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是黑色的,也就是说任意⼀条路径不会有连续的红色结点。3,如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的红色结点。4,对于任意⼀个结点,从该结点到其所有空结点(NULL)的简单路径上,均包含相同数量的黑色结点。
2025-05-23 23:18:37
820
原创 C++(初阶)(十八)——AVL树
二,更新后parent的平衡因⼦等于1或-1,更新前更新中parent的平衡因⼦变化为0->1或者0->-1,说 明更新前parent⼦树两边⼀样⾼,新增的插⼊结点后,parent所在的⼦树⼀边⾼⼀边低,parent所 在的⼦树符合平衡要求,但是⾼度增加了1,会影响parent的⽗亲结点的平衡因⼦,所以要继续向 上更新。3,插⼊结点,会增加高度,所以新增结点在parent的右子树,parent的平衡因子++,新增结点在 parent的左子树,parent平衡因子–
2025-05-17 21:26:41
931
原创 C++(初阶)(十七)——map
map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持 ⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的 内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实 现,增删查改效率是 O(logN) 1 2 3 4 ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的。map底层的红⿊树节点中的数据,使⽤pair存储键值对数据。
2025-04-30 22:30:36
549
原创 C++(初阶)(十六)——set
1,set的声明如下,T就是set底层关键字的类型2,set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数3,set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。4,⼀般情况下,我们都不需要传后两个模版参数。5,set底层是⽤红⿊树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序的。
2025-04-30 21:11:26
1657
原创 C++(初阶)(十五)——二叉搜索树
4,⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,后续我 们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值。key/value的搜索场景实现的⼆叉树搜索树⽀持修改,但是不⽀持修改key,修 改key破坏搜索树性质了,可以修改value。2,树不空,按⼆叉搜索树性质,插⼊值⽐当前结点⼤往右⾛,插⼊值⽐当前结点⼩往左⾛,找到空位置,插⼊新结点。
2025-04-30 17:11:21
583
原创 C++(初阶)(十四)——多态
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。Person对象买票全价,Student对象优惠买票。类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。注意⾮成员函数不能加virtual修饰。public:cout << "买票->全价" << endl;
2025-04-28 22:11:18
967
原创 十二,stack和queue
该文章摘要介绍了C++中的stack、queue和priority_queue三种容器适配器。主要内容包括:1) stack和queue的基本操作函数表;2) priority_queue的详细说明,包括其默认降序排序、底层堆结构实现、默认使用vector容器等特点,以及其操作函数表;3) 简单使用和模拟实现的示例链接;4) 对deque容器的优缺点分析,指出其在头尾操作效率高但中间插入删除效率低的特性。文章提供了这些容器适配器的核心概念和关键操作函数,适合快速了解这些数据结构的基本特性。
2025-04-22 22:58:44
414
原创 十,vector模拟实现
但是我们需要注意的一点是在拷贝原空间的数据时,使用memcpy对内置类型的拷贝时满足我们的需求,但是在对自定义类型的拷贝时是值拷贝,也就是浅拷贝,不符合需求,此时解决办法是遍历原空间依次赋给新空间。可以想到的是把size_t类型修改为int类型,这样就可以解决,但是这样有引发新的问题,对于无符号整型类型没办法处理,所以直接两个都留下,构成了函数重载。但是如果仅仅只写这一种的话,在我们实现对迭代器区间初始化时,会发生错误匹配的情况,是模板实例化时的问题,2,即拷贝原空间的数据到新空间,并delete原空间。
2025-04-07 20:55:05
797
原创 C++(初阶)(八)——string
string是一个模板,管理char的顺序表string存在于c++标准模板库std中,如果std没有展开需要加上std::底层是顺序表npos在32位系统下,最大为42亿多,-1是unsinged int类型的最大值(42亿多),作为npos缺省值。
2025-03-24 21:51:48
925
原创 C++(初阶)(六)——内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间 还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;
2025-03-17 17:19:09
1047
原创 C++(初阶)(四)——日期类实现
先实现==函数,而正好我们又有<函数,直接复用,然后对二者取反更简单,而且一旦某处出现错误,能。2,直接复用前面的,小的日期不断++,当和大的相等时,++多少次,就是相差多少天。1,小的月和天,和大的对齐,算差多少天,年直接减,再处理闰年2月。首先我们最容易想到的就是,直接c,v上面的小于,但是更好的有;都需要++,但是前者返回++之后的值,后者返回++之前的值。上面我们实现了+=,所以在实现+时,直接复用+=就行了。年小就小,相等比较月,再相等比较天,其他为false。
2025-03-12 18:10:19
639
原创 C++(初阶)(三)——类和对象(中)
7,我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于⾃定义类型成员变量,要求调⽤这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要⽤初始化列表才能解决,初始化列表,我们下个章节再细细讲解。说明:C++把类型分成内置类型(基本类型)和⾃定义类型。内置类型就是语⾔提供的原⽣数据类型,
2025-03-12 18:00:30
909
原创 C++(初阶)(二)——类和对象
类(Class)是一种用于创建对象的蓝图或模板。它定义了对象(变量)的属性(数据)和方法(行为)。类是面向对象编程(OOP)的核心概念之一,用于组织代码并实现封装、继承和多态等特性。
2025-03-06 20:57:12
1074
原创 数据结构(初阶)(八)----排序
希尔排序法的基本思想是:先选定⼀个整数(通常是gap = n/3+1),把待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序,当gap=1时,就相当于直接插⼊排序。的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前"坑"下标(即分界值下标),直到所有的记录插⼊完为⽌,得到⼀个新的有序序列。
2025-03-02 20:28:24
1084
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅