- 博客(53)
- 收藏
- 关注
原创 Linux -- 库制作与原理
静态链接的出现,提⾼了程序的模块化⽔平。对于⼀个⼤的项⽬,不同的⼈可以独⽴地测试和开发 ⾃⼰的模块。通过静态链接,⽣成最终的可执⾏⽂件。我们知道静态链接会将编译产⽣的所有⽬标⽂件,和⽤到的各种库合并成⼀个独⽴的可执⾏⽂件, 其中我们会去修正模块间函数的跳转地址,也被叫做编译重定位(也叫做静态重定位)。⽽动态链接实际上将链接的整个过程推迟到了程序加载的时候。
2026-11-08 16:55:41
312
原创 Linux -- 基础IO
open()的作用:打开一个文件,并返回一个文件描述符pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。
2026-10-09 21:42:02
223
原创 Linux -- 进程控制
在 linux 中 fork 函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程, ⽽原进程为⽗进程。进程调⽤ fork ,当控制转移到内核中的 fork 代码后,做:• 分配新的内存块和内核数据结构给⼦进程• 将⽗进程部分数据结构内容拷⻉⾄⼦进程• 添加⼦进程到系统进程列表当中• fork 返回,开始调度器调度所以,fork之前⽗进程独⽴执⾏,fork之后,⽗⼦两个执⾏流分别执⾏。注意,fork之后,谁先执⾏完 全由调度器决定• 系统中有太多的进程。
2026-10-05 21:31:09
287
1
原创 Linux -- 进程概念
• 在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成 本增加,我们称之为进程调度O(1)算法!
2026-10-05 21:30:37
263
2
原创 C++ -- 异常及智能指针
• 异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理, 异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后 解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。• C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以 后还要去查询错误信息,⽐较⿇烦。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。• 程序出现问题时,我们通过抛出(throw)⼀个对象来引发⼀个异常,该对象
2026-05-30 09:49:09
175
原创 C++ -- 哈希表实现
哈希(hash)⼜称是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。
2026-05-26 23:05:52
416
5
原创 C++ -- AVL树
AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。• AVL树实现这⾥我们引⼊⼀个(balance factor)的概念,每个结点都有⼀个平衡因⼦,任何 结点的平衡因⼦等于右⼦树的⾼度减去左⼦树的⾼度,也就是说任何结点的平衡因⼦等于0/1/-1, AVL树并不是必须要平衡因⼦,但是有了平衡因⼦可以更⽅便我们去进⾏观察和控制树是否平衡, 就像⼀个⻛向标⼀样。
2026-05-15 23:21:29
5546
7
原创 C++ -- 红黑树
他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,,因⽽是接近平衡的。
2026-05-15 23:20:56
520
1
原创 C++ --map和set的使用
• set的声明如下,T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模 版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是 ,迭代器遍历是⾛的搜索树的中序,所以是有序 的。O(logN)
2026-05-09 19:08:24
562
原创 C++ -- 二叉搜索树
⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:• 若它的左⼦树不为空,则• 若它的右⼦树不为空,则• 它的左右⼦树也分别为⼆叉搜索树• ⼆叉搜索树中可以⽀持插⼊相等的值,,具体看使⽤场景定义map/set不⽀持插⼊相等 值,multimap/multiset⽀持插⼊相等值。
2026-05-08 20:00:06
534
原创 算法 -- 前缀和
a. 先预处理出来⼀个「前缀和」数组: ⽤dp[i] 表⽰: [1, i] 区间内所有元素的和,那么dp[i - 1] ⾥⾯存的就是[1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i];b. 使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的和: 当询问的区间是[l, r] 时:区间内所有元素的和为: dp[r] - dp[l - 1]。
2026-04-28 23:11:55
47
原创 C++ -- 模板进阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2026-04-25 17:09:19
343
7
原创 C++ -- :stack,queue,priority_queue
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的 顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2026-04-24 21:59:47
398
2
原创 C++ --vector使用及实现
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理 论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end 的位置,而end位置是没有元素的,那么pos就失效了。以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释 放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块 已经被释放的空间,而引起代码运行时崩溃。resize在开空间的同时还会进行初始化,影响size。
2026-04-18 23:11:07
333
原创 C++ -- string
auto不再是一个存储类型 指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期 推导而得。用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&当在同一行声明多个变量时,这些变量,否则编译器将会报错,因为编译器实际 只对第一个类型进行推导,然后用推导出来的类型定义其他变量。auto,可以做返回值,但是建议谨慎使用auto声明变量。
2026-04-11 23:34:56
443
原创 C++ --函数模板
class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误// 扩容++_size;
2026-04-04 15:19:25
271
原创 C++ --内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);//或A* p7 = new A[3] { A(1), A(2), A(3) };
2026-04-02 23:14:37
370
原创 C++ -- 类和对象
内置类型就是语⾔提供的原⽣数据类型, 如:int/char/double/指针等,⾃定义类型就是我们使⽤class/struct等关键字⾃⼰定义的类型。
2026-03-29 22:42:36
364
原创 数据结构--实现链式结构二叉树
层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2 层上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程。:访问根结点的操作发⽣在遍历其左右⼦树之中(间。:访问根结点的操作发⽣在遍历其左右⼦树之前。:访问根结点的操作发⽣在遍历其左右⼦树之后。访问顺序为:左⼦树、根结点、右⼦树。访问顺序为:根结点、左⼦树、右⼦树。访问顺序为:左⼦树、右⼦树、根结点。
2026-03-15 23:14:33
273
原创 数据结构--堆
能想到的最简单直接的⽅式就是排序,但是:如果数据量⾮常⼤,排序就不太可取了 (可能数据都不能⼀下⼦全部加载到内存中)。将剩余N-K个元素依次与堆顶元素⽐完之后,堆中剩余的K个元素就是所求的前K个最⼩或者最⼤的元 素。将根结点最⼤的堆叫做最⼤堆或⼤根堆,根结点最⼩的堆 叫做最⼩堆或⼩根堆。时间复杂度:O(n) = k + (n − k)log2 k。最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。并非借助堆,而是借助堆的思想排序数组(求前k个最⼤的元素,则建⼩堆。求前k个最⼩的元素,则建⼤堆。
2026-03-12 16:12:52
278
原创 数据结构--树
树是⼀种的数据结构,它是由 n(n>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。有⼀个特殊的结点,称为根结点,根结点没有。每棵⼦树的根结点,可以 有 0 个或多个后继。因此,树是递归定义的。树形结构中,否则就不是树形结构;非树形结构:⼦树是(如果存在相交就是图了)除了根结点外,每个结点有且仅有⼀个。
2026-03-09 15:20:42
443
原创 C语言--文件管理
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。
2026-03-08 20:37:49
434
原创 数据结构--队列
只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出⼊队列:进⾏插⼊操作的⼀端称为队尾出队列:进⾏删除操作的⼀端称为队头队列也可以数组和链表的结构实现,使⽤链表的结构实现更优⼀些,因为如果使⽤数组的结构,出队 列在数组头上出数据,效率会⽐较低。
2026-03-07 22:37:14
96
原创 数据结构--复杂度
时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。所以对空间复杂度很是在乎。函数运⾏时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好 了,因此空间复杂度主要通过函数在运⾏时候显式申请的额外空间来确定。空间复杂度也是⼀个数学表达式,是对⼀个算法在运⾏过程中因为算法的需要额外临时开辟的空间。,因为当N不断变⼤时, 低阶项对结果影响越来越⼩,当N⽆穷⼤时,就可以忽略不计了。算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。
2026-03-04 20:30:04
54
原创 数据结构--链表
3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续。1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续。2、结点⼀般是从堆上申请的。
2026-02-24 23:02:45
118
原创 C语言--动态内存管理
⽅便内存释放 如果我们的代码是在⼀个给别⼈⽤的函数中,你在⾥⾯做了⼆次内存分配,并把整个结构体返回给⽤ ⼾。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返 回给⽤⼾⼀个结构体指针,⽤⼾做⼀次free就可以把所有的内存也给释放掉。包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤ ⼩,以适应柔性数组的预期⼤⼩。这样函数返回的是⼀个。当我们把malloc申请的空间的起始地址,存放在p中是,,不会修改str,str依旧为NULL,
2026-01-18 23:31:13
717
原创 C语言--自定义类型(联合和枚举)
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。4. 使⽤⽅便,⼀次可以定义多个常量 5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,联合的⼤⼩⾄少是最⼤成员的⼤⼩。⾄少是最⼤成员的⼤⼩。
2026-01-12 14:29:02
373
原创 C语言--内存函数
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。如果source和destination有任何的重叠,复制的结果都是未定义的。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。这个函数在遇到 '\0' 的时候并不会停下来。
2026-01-10 22:06:18
306
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅