- 博客(69)
- 收藏
- 关注
原创 库的制作和原理
1:静态链接的出现,提⾼了程序的模块化⽔平。对于⼀个⼤的项⽬,不同的⼈可以独⽴地测试和开发:⾃⼰的模块。通过静态链接,⽣成最终的可执⾏⽂件。2:我们知道静态链接会将编译产⽣的所有⽬标⽂件,和⽤到的各种库合并成⼀个独⽴的可执⾏⽂件,:其中我们会去修正模块间函数的跳转地址,也被叫做编译重定位(也叫做静态重定位)。3:⽽动态链接实际上将链接的整个过程推迟到了程序加载的时候。
2025-11-23 19:39:13
840
1
原创 Linux的基础IO流
pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1。
2025-11-08 22:43:40
1234
原创 Linux进程控制
在Linux中fork函数是非常重要的函数,他从已存在的进程中创建一个新的进程,新的进程是子进程,而原进程是父进程。进程调用fork,当控制转移到内核中的fork代码后,内核做:1:分配新的内存块和内核数据结构给子进程2:将父进程部分数据结构内容拷贝到子进程3:添加子进程到系统进程列表中4:fork返回,开始调度器调度当一个进程调用fork之后,就会有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始自己的旅程。
2025-11-08 22:43:24
910
原创 Linux的进程认识下
环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性2:常见的环境变量PATH : 指定命令的搜索路径HOME : 指定⽤⼾的主⼯作⽬录(即⽤⼾登陆到Linux系统中时,默认的⽬录)
2025-10-27 22:50:36
346
原创 Linux的进程认识上
我们常见的计算机都遵循着冯诺依曼体系。我们认识的计算机,都是由一个个的硬件组成。关于冯诺依曼的几个点:1:储存器指的是内存2:不考虑缓存情况,这里的CPU只能对内存进行读写,不能访问外设3:外设(输入输出设备)要输入和输出数据,只能写入内存或者从内存读取4:所有设备只能和内存打交道。
2025-10-27 22:50:12
1430
1
原创 Linux的基础开发工具
在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序.但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好⽐ "App" 和 "应⽤商店" 这样的关系.yum(Yellow dog Updater, Modified)是Linux下⾮常常⽤的⼀种包管理器. 主要应⽤在Fedora,
2025-08-25 18:13:12
796
原创 Linux的基础指令
1:ls语法:ls [选项] [⽬录或⽂件功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。常⽤选项:•-a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。•-d 将⽬录像⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。如:ls ‒d 指定⽬录•-i 输出⽂件的 i 节点的索引信息。如 ls ‒ai 指定⽂件•-k 以 k 字节的形式表⽰⽂件的⼤⼩。ls ‒alk 指定⽂件•-l 列出⽂件的详细信息•。
2025-08-25 18:13:02
520
原创 C++11的特性上
C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既有实践,并改进了对 C++ 程序员可⽤的抽象。在它最终由 ISO 在 2011 年 8 ⽉ 12 ⽇采纳前,⼈们曾使⽤名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。
2025-06-11 17:16:21
1031
原创 哈希表的实现
哈希是一种通过哈希函数将关键字映射到存储位置的数据组织方式。哈希函数设计需考虑关键字的均匀分布,常见方法包括直接定址法(适用于关键字集中情况)、除留余数法和乘法散列法等。当不同关键字映射到同一位置时会产生哈希冲突,可通过设计优秀哈希函数和冲突解决方案来缓解。负载因子(存储数据量与哈希表大小的比值)影响冲突概率和空间利用率。非整数关键字需先转换为整数再进行哈希计算。
2025-06-11 17:15:43
437
原创 RBTree的模拟实现
红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。
2025-05-14 17:53:30
497
原创 AVLTree的模拟实现
1:AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。2: AVL树得名于它的发明者G.M.Adelson - Velsky和E.M.Landis是两个前苏联的科学家,他们在1962年的论⽂《An algorithm for the organization of information》中发表了它。
2025-05-14 17:53:15
983
原创 STL中的map和set
set文档• set的声明如下,T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是 ,迭代器遍历是⾛的搜索树的中序,所以是有序的。O(logN)
2025-04-24 15:26:15
1172
原创 二叉搜索树
⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树 :• 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值• 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值• 它的左右⼦树也分别为⼆叉搜索树。
2025-04-24 15:25:53
949
1
原创 C++的多态
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2025-04-21 14:59:11
940
1
原创 C++中的继承
下面我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类 / 派⽣类,也叫⽗类 / ⼦类)// Student的_num和Person的_num构成隐藏关系,可以看出这样代码虽然能跑,但是⾮常容易混淆protected:string _name = "⼩李⼦";// 姓名// ⾝份证号public:cout << " 姓名:" << _name << endl;
2025-04-20 17:16:42
870
1
原创 priority_queue的使用和模拟实现
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。
2025-04-19 14:39:28
357
原创 stack和queue的使用和模拟实现
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
2025-04-19 14:39:12
890
原创 list的模拟实现和反向迭代器的底层
对于list的模拟实现,我们需要先定义一个节点的类可以使用(class也可以使用struct)上面的结构体和我们模拟实现链表的代码基本上差不多,只不过将初始化化成了构造函数,并且将链表封装成一个类并且提供对于链表的操作。
2025-04-18 00:03:58
489
原创 list的使用
在之前我们对于链表有过最初始的模拟实现,现在进入C++之后,我们可以在STL库中发现到链表这个容器的使用,list的底层也是我们最初实现的双向链表。
2025-04-18 00:03:50
829
原创 vector的模拟实现
观看下面测试代码最后代码报错了,这是浅拷贝导致的问题memcpy 导致浅拷贝的核心原因在于其仅进行字节级别的机械复制,不处理对象内部的资源管理逻辑。具体分析如下:memcpy 的工作机制:memcpy 按字节逐份复制内存区域,不关心数据类型或对象内部结构。例如,对于一个包含指针成员的类对象,它仅复制指针变量本身的值(即内存地址),而非指针指向的动态分配内存中的数据。
2025-04-11 10:55:03
487
原创 vector的基础使用+迭代器失效
迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。会引起迭代器失效的操作。
2025-04-11 10:54:40
455
原创 深入理解C++内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;
2025-03-22 22:40:10
701
1
原创 运算符重载(关键字operator的使用)
i < _n;= nullptr)elsecout << "下标超出范围" << endl;exit(1);return _n;int _n;return 0;
2025-03-22 22:39:54
889
1
原创 基础的排序算法上(插入排序和选择排序)
所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的操作。2:应用你所能看到的一件排序都有排序算法的影子2:常见的排序算法。
2025-03-03 11:24:59
459
1
原创 基础的排序算法下(交换排序和归并排序)
基本思想:所谓交换,就是根据序列中两个记录键值的⽐较结果来对换这两个记录在序列中的位置 交换排序的特点是:将键值较⼤的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
2025-03-03 11:24:33
507
7
原创 二叉树的链式结构
⽤链表来表示⼀棵⼆叉树,即⽤链来指示元素的逻辑关系。通常的⽅法是链表中每个结点由三域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。2:链式结构的实现1:结构体定义}BTNode;
2025-02-23 17:18:20
418
1
原创 栈和队列的实现(C语言)
栈:一种特殊的线性表,其只运行在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出的原则。
2025-02-07 22:06:49
413
2
原创 在C语言基础上的C++(静态成员与友元与模板)
看下面代码实例private:public:count++;compute();count++;compute();cout << ID << ":" << NP << "当前团购人数" << count << "当前折扣:" << discout * 100 << "%" << endl;compute();//静态成员初始化void fc()u3.show();
2025-01-09 00:55:49
624
原创 在C语言基础上的C++(深入理解类和对象)
由于类的封装性,一般来说,数据成员是不能被外界访问的,所以对象的数据成员的初始化工作就给共有函数来完成了。如果定义了构造函数,那么只要对象一建立,就可以自动调用构造函数,来完成对象的初始化。
2025-01-02 21:43:40
882
原创 在C语言基础上的C++第二章(类和对象)
类是一种用户定义的数据类型,它就像是一个蓝图或者模板,用于创建对象。例如,在建造房子时,建筑图纸就是 “类”,而根据这个图纸建造出来的一个个具体的房子就是 “对象”。类是抽象的,定义的student类不是指哪个特定学生。利用类可以像定义变量一样定义对象。例如private:int no;public:cout
2024-12-26 12:58:00
1245
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅