自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【网络版本计算器的实现】

注意!!注意!!注意!!

2024-05-24 21:24:57 609 1

原创 【贪心算法题目】

这个题目依然是采用贪心来解决,将所有的数字当成字符串处理,那么两个数字之间的拼接操作以及比较操作就会很方便,此时我们只需要找出每次两个值组合的最大的排序方式重新定义⼀个新的排序规则,然后排序即可即可解决问题。细节问题:有可能数组中所有的元素都是0,此时结果会有很多0,因此我们需要单独去除前导0。注意:由于本题最大的面值是20元,所以只需要统计5元和10元的数量即可。

2024-05-23 22:01:33 401 1

原创 简单的TCP网络程序:英译汉服务器

下面介绍程序中用到的socket API,这些函数都在sys/socket.h中。

2024-05-23 20:22:36 1195 10

原创 简单的UDP网络程序:多人群聊系统

我们把服务器封装成一个类,当我们定义出一个服务器对象后需要马上初始化服务器,而初始化服务器需要做的第一件事就是创建套接字。这里我们使用我们之前写的Log.hpp文件来方便观察输出信息。当我们在进行初始化服务器创建套接字时,就是调用socket函数创建套接字,创建套接字时我们需要填入的协议家族就是AF_INET,因为我们要进行的是网络通信,而我们需要的服务类型就是SOCK_DGRAM,因为我们现在编写的UDP服务器是面向数据报的,而第三个参数之间设置为0即可。

2024-05-22 21:52:28 773 1

原创 【C++算法】BFS解决拓扑排序问题相关经典算法题

有向无环图是一种特殊的图数据结构。在这样的图中,节点之间通过有向边连接,表示从一个节点到另一个节点的单向关系,并且不存在任何形式的环路,即没有路径可以让你从一个节点出发,沿着一系列有向边最终又回到该节点。拓扑排序是对一个有向无环图的顶点进行排序的一种方法,找到做事情的先后顺序,拓扑排序的结果可能不唯一。AOV网就是在有向无环图中每一个顶点代表一个活动,而有向边则表示活动之间的优先关系的图结构。这个题目给的实例比较简单,我们重新来给一个案例来快速了解这个题目。1.初始化:把所有入度为0的点加入到队列。

2024-05-22 21:43:21 665

原创 计算机网络套接字知识(非常详细)从零基础入门到精通

思考: 我们光有IP地址就可以完成通信了嘛?想象一下发qq消息的例子,有了IP地址能够把消息发送到对方的机器上,但是还需要有一个其他的标识来区分出,这个数据要给哪个程序进行解析,此时就需要我们的目的IP地址。

2024-05-21 21:49:42 610 1

原创 计算机网络基础知识(非常详细)从零基础入门到精通

独立模式:计算机之间相互独立网络互联:多台计算机连接在一起,完成数据共享局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起广域网WAN:将远隔千里的计算机都连在一起所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如,我们有 "天朝特色" 的广域网,也可以看做一个比较大的局域网。

2024-05-21 21:41:23 1005

原创 【C++算法】BFS解决多源最短路问题相关经典算法题

这道题目如果我们按照每次遍历数组每次遇到1就去bfs,肯定是会超时的,但是根据这个写法也有不超时的做法,我们遍历的时候,遇到1就去bfs,并将途中遇到1的位置标记一下,下一轮遇到1的时候,先dfs一下,如果这次dfs宽搜的时候遇到1,发现这个位置已经标记过,此时就不要bfs了,直接就是上次的结果,但是这样写需要两次dfs,并且dsf的代码还不一样,也比较麻烦,那我们来一个新思路:正难则反,我们可以从边上的 1 开始搜索,把与边上 1 相连的联通区域全部标记⼀下;但是如何将这个源点当作一个超级源点呢?

2024-05-20 21:56:30 425 1

原创 【C++算法】BFS解决单源最短路问题相关经典算法题

我们利层序遍历来解决最短路径问题,是最经典的做法。我们可以从起点开始层序遍历, 并组在遍历的过程中记录当前遍历的层数。首先我们看到这个题目,真的是难从下手,既然我们这章是最短路径,我们可以尝试从这方面来考虑考虑,我们可以考虑尝试来转化一下哈。首先我们可以将这道题目简化一下,可以往我们这一章的主题上面来想想。

2024-05-19 10:54:30 324 1

原创 【C++算法】BFS解决FloodFill算法相关经典算法题

首先我们来看看这道题目,我们可以肯定的是这个可以利用上面的图像渲染来做这道题目,但是呢?我们这道题目有点现在,在边界的情况下我们是不能修改的,但是也能做,我们第一遍bfs的时候,不修改里面的值,只遍历到那些边界的情况记录下来,第二次bfs的时候如果遇到上次边界的情况,我们就不修改,如果没有我们就修改,但是太麻烦了,我们有没有更简单的做法呢?

2024-05-16 19:45:44 160 1

原创 【C++算法】堆相关经典算法题

如果还有剩余,就将剩余的石头继续放在原始的石堆里面重复上面的操作,直到石堆里面只剩下一个元素,或者没有元素(因为所有的石头可能全部抵消了),那么主要的问题就是解决:如何顺利的拿出最大的石头以及次大的石头;我们一看到这个就会说,这行呀!我相信找第K大元素,就能想到TopK问题,兄弟们应该能立马想到「堆」, 这应该是刻在骨子里的记忆,只不过我们要知道找第K大元素我们需要建立小堆,我们要想想,如果我们弄一个大堆,如果第一个元素就是数组中最大的元素,那么此时其他元素如何入堆,哪还找什么第k的元素呢?

2024-05-15 17:31:36 314

原创 【Linux学习笔记】一篇文章彻底搞定“Linux生产者与消费者“!

单例模式是一种"经典的, 常用的, 常考的"设计模式.什么是设计模式IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是设计模式在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。

2024-05-13 18:00:00 741 4

原创 【Linux学习笔记】一篇文章彻底搞定 “Linux同步与互斥“ !

⭐线程安全描述的是线程并发的问题,可重入描述的是函数的特点。⭐不可重入函数,在多线程访问可能会出现线程安全的问题,但是一个函数可重入,那么不会出现线程问题。

2024-05-13 09:35:38 851 3

原创 【C++算法】队列相关经典算法题

这道题相较于上面三道题就有点难度了,这个题目男难就难在处理空节点,既然统计每一层的最大宽度,我们优先想到的就是利用层序遍历,把当前层的结点全部存在队列⾥面,利用队列的常度来计算每一层的宽度,统计出最大的宽度。其实这道题我们也可以用数组来实现,但是这时候有人说了此时我们会经常进行删除节点,而删除节点都是头删,而数组的头删效率较低,你咋还使用我们的数组呢?内存限制,那么此时我们的编号是2的1500次方,那么肯定会越界,此时无论什么数据类型我们都存不下,但是这个题最后我们是会进行减法的,亿个空节点,会超过最。

2024-05-11 21:50:14 866 1

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

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

2024-04-28 21:43:41 712 3

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

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

2024-04-28 21:33:21 1028

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

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

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

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

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

2024-04-27 21:56:42 636

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

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

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

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

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

2024-04-23 15:49:46 808

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

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

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

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

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

2024-04-22 17:25:23 766 21

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

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

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

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

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

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

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

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

2024-04-13 15:28:30 977

原创 【二分算法】

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

2024-04-12 21:49:17 234 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 790 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 758 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 1413 1

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

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

2024-02-03 14:30:18 837

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

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

2024-02-03 14:17:09 1096

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

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

2024-02-03 13:37:32 890

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

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

2024-02-03 13:31:24 979

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

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

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

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

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

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

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

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

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

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

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

2023-12-05 22:02:16 3866 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 1887 42

Makefile.win

Makefile.win

2022-12-30

空空如也

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

TA关注的人

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