自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux学习笔记】一篇文章彻底搞定 “Linux多线程“ !

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流⭐总结一下就是:线程是进程内的一个执行分支,线程的执行粒度要比进程更细。

2024-04-28 21:43:41 667 2

原创 【Linux学习笔记】一篇文章彻底搞定 “Linux进程信号“ !

每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定义 #define SIGINT 2 编号34以上的是实时信号,本章只讨论编号34以下的信号,不讨论实时信号。这些信号各自在什么条件下 产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal。

2024-04-28 21:33:21 1020

原创 Linux学习笔记】一篇文章彻底搞定 “Linux进程间通信“ !

当创建子进程的时候,子进程并不会继承父进程的文件系统,只会继承文件描述符表,此时仅仅是子进程的指向父进程的文件系统,此时就是浅拷贝,此时父子进程就做到了不同的进程,看到同一份资源(缓冲区,由操作系统提供的空间),struct file是允许多个进程通过指针指向我的!⭐所以基于文件的,让不同进程看到同一份资源的通信方式,就叫做管道!!!管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”⭐。

2024-04-27 21:57:10 1132 2

原创 【C++算法】栈相关经典算法题总结

这个题目很有乐趣,解决这道题目我们对这个字符串要纵向看它,此时如果相邻的字符相同,比如我们上面的[b]和[b],我们就可以把它消灭,然后这两个被消除的字符的上面字符[a]往下掉落,然后这个字符又有相邻相同的字符[a],我们又可以它消灭,很像我们玩过的开心消消乐游戏,只不过我们这里的是两个字符相同就满足消消乐,回归本题,既然要纵向看它,此时我们的数据结构就只有栈符合这个条件,当前元素是否被消除,需要知道上⼀个元素的信息,可以⽤栈来保存信息。自然是遇到一个元素等于当前的出栈序列的元素,那我们就让它出栈。

2024-04-27 21:56:42 632

原创 【C++学习笔记】C++11新特性!你绝对不能错过的干货!

在C++11之后,auto还可以用作返回值,但不建议使用。

2024-04-23 23:21:55 956 1

原创 【C++学习笔记】C++类型转换!你绝对不能错过的干货!

1、C++中的4种类型转换分别是:____ 、____ 、____ 、____。⭐。

2024-04-23 15:49:46 803

原创 【C++学习笔记】C++特殊类设计!你绝对不能错过的干货!

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调用以及即可。⭐⭐1. 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就不能禁 止拷贝了⭐2. 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写 反而还简单,而且如果定义了就不能防止成员函数内部拷贝了。⭐在c++标准库中对于IO流的对象不能拷贝就是采用的c++11的方式。

2024-04-22 21:52:26 756 5

原创 【C++学习笔记】C++智能指针!你绝对不能错过的干货!

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.同时还有一种情况。

2024-04-22 17:25:23 754 20

原创 【C++学习笔记】C++异常处理!你绝对不能错过的干货!

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家 随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:// 错误描述int _id;// 错误编号// 继承和多态public:{}return str;

2024-04-20 18:27:22 1008 20

原创 【C++哈希:unordered系列容器&哈希概念&哈希冲突&模拟实现】

线性探测优点:实现非常简单。

2024-04-13 15:36:50 673 4

原创 【深入解析文件系统原理inode,软硬链接,动态静态库区别】

硬链接本质就是在指定的目录下,插入新的文件名和目标文件的映射关系,并让inode的引用计数++软连接本质就是一个独立文件, 软连接内容里面放的目标文件的路径!软连接类似windows下的快捷方式 软连接类似windows下的快捷方式!总结:真正找到磁盘上文件的并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同一个 inode。abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode 263466 的硬链接数为2。

2024-04-13 15:28:30 969

原创 【二分算法】

23. 搜索旋转排序数组中的最⼩值(medium)21. 山峰数组的峰顶(easy)19. 搜索插⼊位置(easy)20. x 的平⽅根(easy)22. 寻找峰值(medium)

2024-04-12 21:49:17 233 1

原创 【C++map和set容器:AVL树、红黑树详解并封装实现map和set】

int _bf;,_bf(0),_kv(kv){}// 节点的颜色RED,BLACK// 红黑树节点的定义,_kv(kv),_col(RED){}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?这里我们可以想象一下,如果我们将插入的节点的默认颜色设置为黑色,那么该条路径上的黑色节点就会增加一个,为了满足对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。

2024-03-14 20:43:22 782 31

原创 【探索C++容器:set和map的使用】

1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。

2024-03-09 17:52:31 835 32

原创 【Linux文件操作的底层原理:文件描述符与缓冲区】

pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写O_TRUNC: 如果文件存在且是可写的,则截断文件为零长度。

2024-02-04 19:51:08 745 4

原创 【二叉搜索树】

看上去挺对,但是我们忽略了一个问题,我们申请的结点给到_cur指针了,而且它时一个局部变量,出了作用域不仅消耗了,而且还会出现内存泄漏,我们此时要解决问题,就要与父指针进行链接,所以此时我们要找到_cur的父节点。但是我们这里的中序无法调用,因为我们的中序要求传入根结点,如果不传入根节点我们这里就无法递归了,我们这里有两种解决方法,第一个方法是写一个获取根节点的函数,因为我们的根节点是私有的,或者我们还可以套一层子函数。我们首先来看第一种情况,当左为空,将右托付给父亲,此时是托付给父亲的右还是父亲的左呢?

2024-02-04 19:49:01 831

原创 【C++栈和队列:数据结构中的经典组合,高效处理先进先出与后进先出问题的最佳方案】

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。

2024-02-03 15:11:30 1393 1

原创 【C++模板特化的奥秘:个性化定制函数与类,掌握代码实现的无限可能】

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。

2024-02-03 14:30:18 833

原创 【C++ STL链表:节点串联,数据无限,解锁高效插入、删除与迭代的奇妙能力】

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是带头双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。4. 与其他序列式容器相比,list最大的缺陷是不支持任意位置的随机访问。

2024-02-03 14:17:09 1078

原创 【C++继承策略:构筑类的层次体系,掌握复用与派生的智慧】

下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。我们先来看一下继承和组合class Apublic:protected:private:int _a;//组合:每个B对象中都有一个A对象//黑箱复用:不清楚内部构成,测试其外观,功能//比如卫生纸:测试纸张抽数,纸张厚度,纸张味道class Bpublic:_a.func1();//保护不可访问private:A _a;//继承:每个派生类对象都是一个基类对象。

2024-02-03 13:37:32 887

原创 【C++多态奥秘:同形异义,编织面向对象的多彩世界】

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 = 0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,因为它会继承来自父类的纯虚函数,只有重写纯虚函数,派生类才能实例化出对象。

2024-02-03 13:31:24 977

原创 【打造你自己的Shell:编写定制化命令行体验】

首先我们知道我们的程序,只能执行我们的代码,如果我们创建的子进程想执行其他程序的代码呢?此时就要使用我们的进程程序替换。进程程序替换(Process Program Replacement)是指一个正在运行的进程,通过加载新的程序代码替代原有的程序代码。进程程序替换的优势在于,它允许一个进程在不产生新进程的情况下改变其执行的程序,从而实现动态的程序加载和切换,而这个替换的工作,存在很多的数据变更,而操作系统是软硬件资源的管理者,所以实现替换工作一定会有对应的系统调用接口。

2024-01-18 20:07:40 1360 38

原创 【探索C++容器:vector的使用和模拟实现】

我们先来看一下vector文档中的构造函数我们先来直接看看第二个构造函数的使用:创建一个包含n个元素的容器。每个元素都是val的副本运行结果:我们再来看看第三个构造函数:创建一个包含与范围 [first, last) 中的元素数量相同的容器,每个元素都是从该范围中对应元素构造而来的,顺序相同。while (it1!++it1;运行结果:我们这里的迭代器区间能不能是其他容器,比如string。//string是char类型,这里模板参数需要转为char。

2024-01-18 20:03:18 1042 12

原创 【解锁创意之门:环境变量引领你的编程奇思妙想】

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增 加,我们称之为进程调度O(1)算法!参考文档所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看图:在多进程编程中,当创建子进程时,操作系统会使用写时复制(Copy-on-Write,COW)技术来优化内存的使用。写时复制是一种延迟内存拷贝的策略,它允许父子进程共享相同的物理内存页,直到其中一个进程尝试修改该页的内容时,才会真正进行拷贝。

2024-01-07 18:40:07 1906 12

原创 【计算机系统基石与Linux进程管理深度解析】

看看Linux内核源代码怎么说为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)。/**/R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。

2023-12-05 22:02:16 3848 29

原创 【“C++ 精妙之道:解锁模板奇谭与STL精粹之门“】

class 类模板名// 类内成员定义public://类里面声明~Stack()_top = 0;int _top;//规定缺省参数在声明处提供缺省值Stack<T>::Stack(int capacity)//类外面定义_top = 0;注意:类模板声明和定义分离不能到两个文件上,会发生链接错误。STL(standard template libaray-标准模板库)是C++标准库的重要组成部分,不仅是一个可复用的组件库,

2023-12-05 21:59:20 1875 42

原创 【字符串探秘:手工雕刻的String类模拟实现大揭秘】

就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就 你争我夺,玩具损坏。可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩 子都买一份玩具,各自玩各自的就不会有问题了。

2023-11-30 22:50:10 1623 55

原创 【编码艺术:掌握String类函数接口的妙用指南】

1. string是表示。

2023-11-30 19:20:55 929 46

原创 【深入解析git和gdb:版本控制与调试利器的终极指南】

git是一个分布式版本控制系统,用于跟踪项目代码的变化。版本控制器(Version Control System,VCS)是一种记录和管理文件或代码变更的系统。它追踪文件的历史变更,允许用户回溯到先前的状态,并支持多人协同开发。GitHub是一个基于Git的代码托管平台,提供了代码仓库的托管服务。开发者可以将他们的项目代码存储在GitHub上,并与团队成员协同工作。GitHub也提供了许多协作和社交功能,如问题跟踪、代码审查、项目管理等,使得团队协作更加便捷。Gitee(码云)是中国。

2023-11-28 22:30:52 2146 53

原创 【探讨C++内存管理:有效避免内存泄漏与提高性能的关键】

int main()// malloc不方便解决动态申请的自定义类型对象的初始化问题// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间\还会调用构造函数和析构函数// new的本质:开空间+调用构造函数初始化// delete的本质:调用析构函数+释放空间//error C2521: 析构函数 不带任何参数free(p1);

2023-11-22 09:21:23 1179 91

原创 【命令行魔法:掌握Linux基础工具开发的独门技艺】

这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件.安装完毕之后可以通过拖拽的方式将文件上传过去.关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!可以通过 ping 指令验证。

2023-11-15 23:22:39 774 58

原创 【C++类和对象下:解锁面向对象编程的奇妙世界】

的。

2023-11-13 22:57:23 367 47

原创 【Linux权限:系统中的数字锁与安全之门】

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。本章结束啦!下章见,拜拜。

2023-11-08 08:06:22 2717 69

原创 【C++类和对象中:解锁面向对象编程的奇妙世界】

7. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。可以不传参数就调用构造,都可叫。

2023-11-06 23:02:26 894 67

原创 【C++类和对象上:解锁面向对象编程的奇妙世界】

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字,{}中为类的主体注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

2023-11-01 16:46:48 279 73

原创 【C++入门:C++世界的奇幻之旅】

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。现在我们来介绍一下命名空间,注意:C++是兼容90%的C语言。当我们加入头文件<stdlib.h>时程序就报错了,因为该文件下有一个rand函数,和我们当前的全局变量rand出现了命名冲突的问题。// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决int main()return 0;

2023-10-24 14:08:35 523 69

原创 【Linux入门指南:掌握开源操作系统的基础知识】

1.知道当前系统登陆的用户2.查看当前有多少用户在登录当前系统3.查看当前所处的目录4.查看当前/root目录下有哪些文件5.清屏。

2023-10-20 13:11:28 937 59

原创 【探索排序算法的魅力:优化、性能与实用技巧】

1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定。

2023-10-01 12:37:12 1383 81

原创 【二叉树魔法:链式结构与递归的纠缠】

很明显,不是,所以上面的思路是错误的。不行,层序遍历没有先访问左子树和右子树的关系,层序遍历是一层一层访问的,递归的思想不符合层序遍历,这里我们可以使用队列,先把根节点入队列,然后当根节点出队列的时候,再把根节点的左右孩子入队列,特点是上一层带下一层,由于队列是先进先出的特点,刚好符合层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

2023-09-22 21:41:55 1052 78

原创 【完全二叉树魔法:顺序结构实现堆的奇象】

去调整堆,然后在缩小下次向下调整的范围,也就是把最大的那个数不算做堆的范围了,这样最大的数据就保存在了下标最大的位置处,满足了升序的要求。此时就要重新建堆,然后再取堆顶数据,再建堆...每次建堆的时间复杂度N*logN,一共有N个数据,所以总的排序时间复杂度就是N * logN * N,那还不如直接遍历一遍排序来的快呢!这里不能用大堆,如果第一个数据就是最大的,放在堆顶,其余数据就无法入堆,所以要用小堆,最大的前k个数肯定比堆顶大,此时该数替换堆顶的数入堆,入完k个后就找到前k个最大的元素。

2023-09-20 18:33:02 812 84

Makefile.win

Makefile.win

2022-12-30

空空如也

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

TA关注的人

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