![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 95
Dio夹心小面包
"放弃学习的我们是没有翅膀的雄鹰 不会理智的我们是根茎腐烂的大树"
展开
-
『 Linux 』简单日志插件
日志(log)是一种记录和存储系统运行状态,事件,和操作历史的文件和数据库,这些记录通常以时间顺序排列且详细记录系统中发生的各种活动;系统日志记录操作系统级别的事件,如启动,关机,错误和警告等;记录应用程序运行过程中的事件,如用户操作,错误,状态变更等;安全日志记录系统和应用程序的安全相关事件,如登录尝试,权限变更等;问题诊断和故障排查日志可以帮助系统管理员和开发人员诊断和解决问题;系统监控和维护通过分析日志,管理员可以监控系统的运行状态并且识别潜在的问题和异常;安全审计和合规性。原创 2024-07-17 18:38:58 · 892 阅读 · 0 评论 -
『 Linux 』匿名管道应用 - 简易进程池
当一种资源需要被使用时这意味着这个资源可能会被进行多次使用或者需要同时使用多个该资源,当出现这种情况时内核将会频繁的对该资源进行申请并释放,大大降低整体的效率;整体构造采用先描述后组织的方式对进程池进行设置,并以自顶向下的方式进行设计,即先将所需接口以声明的形式标出而后再对接口进行具体实现;本文模拟实现的进程池通过多个匿名管道实现进程间通信使得一个进程与多个其对应的血缘关系进程进行协同从而形成一个进程池[父写子读];子进程为父进程的一份拷贝,当父子进程中其中一个进程被修改时(即对物理内存进行修改);原创 2024-07-13 22:41:13 · 963 阅读 · 0 评论 -
『 Linux 』 进程间通信 - 匿名管道 (万字)
管道(Pipe)是一种基本的进程间通信(IPC)机制,允许一个进程与另一个进程之间进行数据传输;管道工作方式类似于生活中的水管因此命名为管道,数据从一端流入另一段流出,数据流为单向;Linux中可以使用查看当前登入系统的用户数;who命令用与显示当前登入系统的用户信息,其中一条会话代表一个用户;wc -l命令统计当前行数;两条命令通过管道符进行连接,即将显示的信息通过管道符传输给wc命令再进行统计行数;符号即为一种管道;匿名管道(Anonymous Pipes)不存在命名的管道,用于。原创 2024-06-21 16:57:08 · 1007 阅读 · 0 评论 -
『 Linux 』缓冲区(万字)
缓冲区(Buffer),顾名思义就是一块可以用于缓存的空间;也可以说实际上缓冲区是一种临时存储区域,一般用于在数据传输过程中对数据的缓存;缓冲区的主要目的是协调数据产生者和消费者之间的速度差异以提高系统的效率和性能;那么具体什么是缓冲区?存在几个例子:下文中所出现的例子都将使用两种方式(直接运行 ,重定向至文件当中)以便于区分两种情况的不同之处;[例1]// C标准库接口// 系统调用接口return 0;在这段代码当中分别用了C标准库接口与系统调用接口分别对不同的massage。原创 2024-05-31 17:10:04 · 759 阅读 · 0 评论 -
『 C++11 』右值引用(万字)
在C++早期当中,位于赋值符号左侧的变量被称为左值;而在C++11左值(Left Value)左值的定义不再仅仅与赋值符号有关,左值实际上是指具有标识符的对象,且可以取地址并且可以进行引用,通常左值具有确定的内存位置;a1 = b1;//在C++11之前该种情况下a1为左值b1为右值//但在C++11后的概念当中 a1与 b1都为左值//--------// 以下的p b c *p皆为左值int b = 1;//对上面的左值进行引用return 0;在早期的C++原创 2024-04-17 16:05:04 · 564 阅读 · 0 评论 -
『 C++ 』海量数据处理
故数据中必然存在大量的重复数值,而位图当中可以精确计算数据对应的是否存在问题,其最大数据为。再次遍历另外一个文件,当遇到相同值时保存该值(该数据为交集),并将该数据对应的映射置为。但是若是将文件进行平均切分,在遍历时只能采用暴力枚举的方式,对于检查的效率将会低至。位图可进行映射与去重的操作,可将两个文件遍历并映射至位图当中进行去重;当出现抛该异常时说明在遍历小文件的过程中某个文件中的数据量过大;当出现抛该异常时说明在遍历小文件的过程中某个文件中的数据量过大;原创 2024-02-18 18:37:24 · 1114 阅读 · 1 评论 -
『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)
腾讯曾经有一道面试题是这样的:存在40亿个不重复的无符号整数,其中这些数据并未排过序;给定一个无符号整数,如何快速判断这个数是否存在于这40亿个数中;很显然,这个面试题问的是一个数据在不在的问题;那么如何能够对数据进行判断在不在的问题?遍历数据逐个判断遍历数据逐个判断可以理解为一种暴力的解法,这种暴力的解法通过枚举的思路对数据逐个查询;但实际上该方法的时间复杂度为O(N)[由于需要遍历整组数据]......;原创 2024-02-15 20:10:24 · 1217 阅读 · 1 评论 -
『 C++ - STL 』unordered_xxx系列关联式容器及其封装(万字)
unordered系列关联式容器在C++11标准中被首次引入,与有序容器不同,unordered系列的关联式容器并不会去维护数据中各个元素的顺序,由于该系列容器为哈希表实现,所以整体的存储顺序是由哈希函数决定的,可以在一些不需要对数据进行排序的场景下提供更快的性能;原创 2024-02-06 17:45:04 · 1547 阅读 · 3 评论 -
『 C++ - Hash 』闭散列与开散列哈希表详解及其实现 ( 万字 )
哈希表是一种常用的数据结构,该数据结构往往能存储大量的数据,在C++当中,底层为哈希表的容器最常见的为unordered_xxx系列,例如unordered_map与unordered_set,这两个容器是在C++当中以哈希表为底层的关联式容器,具体的关联式容器的特点参照上篇;哈希表通过一个叫做哈希函数(Hash Function)的算法,将存储的每个数据项与一个唯一的键值(key)进行绑定;这个函数会将每个键值映射到哈希表中的一个位置,以便对数据进行快速访问;原创 2024-02-04 23:50:53 · 1142 阅读 · 3 评论 -
『 C++ - STL』map与set的封装 ( 万字 )
map与set分别是STL中的两种序列式容器;它们是一种树形数据结构的容器,且其的底层构造为一棵红黑树;而在上一篇文章中提到,其实红黑树本身就是一棵二叉搜索树,是基于二叉搜索树的性质对其增加了平衡的属性来提高其综合性能(包括增删查改);当然也提到了红黑树与AVL树的区别:AVL树AVL树是一棵高度平衡搜索二叉树,其特点即为在搜索二叉树的基础上根据控制结构达到了最终的属性;即为,每一个节点的左右子树的高度差不超过1;红黑树红黑树是一棵近似平衡的二叉树,其特点为根据树的颜色(红色或是黑色)原创 2024-01-20 18:37:00 · 1033 阅读 · 0 评论 -
『 C++ 』红黑树RBTree详解 ( 万字 )
AVL树AVL树采用的是利用平衡因子来控制;红黑树红黑树采用的是以颜色来判断树的结构;由上文概念中几个规则可能引出一个问题:红黑树中的新节点应该是什么颜色?黑色?红色?如果一个节点为红色,其两个孩子节点必定为黑色;对于每一个节点,从该节点到所有后代叶节点的简单路径上,都包含相同数目的黑色节点;根据这两个规则进行引入,权衡利弊可以发现新节点无论是黑色还是红色都有可能违反两条规则中的其中一条规则;但是对于两条规则的违反代价来说,新节点为黑色的代价要高于新节点为红色的代价;原创 2024-01-17 17:32:44 · 1366 阅读 · 1 评论 -
『 C++ 』AVL树详解 ( 万字 )
从上文可知,AVL树可以看作是一棵搜索二叉树,其为基于搜索二叉树在此基础上对树做了平衡的操作使其在结构上变得平衡不至于在极端情况下出现"歪脖子树"的情况;AVL树的定义与平衡搜索二叉树的结构上呈现类似;//将节点进行typedefpublic:protected:private://节点指针该篇文章中重点实现AVL树中的插入操作;原创 2024-01-15 23:00:27 · 799 阅读 · 1 评论 -
『 C++ 』二叉树进阶OJ题
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(该题的解题思路与上一题二叉树的中序遍历如出一辙,即也是通过将树分为左路节点与左路节点的右子树的方式;由于也是按照左路节点与左路节点的右子树的左路节点将问题化为子问题进行迭代的思路,所以。的特性将数据进行存储,并且反向拿出,即以该树的左路节点为例,将左路节点全部入栈,的方式判断左右两个子树,当节点访问至两个节点的其中一个节点时返回该节点;原创 2023-12-21 12:33:08 · 906 阅读 · 12 评论 -
『 C++ 』BinarySearchTree搜索二叉树
二叉树顾名思义即为一个树中节点的度不大于2的有序树,是树中结构中较为简单的一种;其特点为一个节点中分为两个子树;通常可以以二叉树进行分治的思路对问题进行解决(递归或非递归);但在实际中普通二叉树由于在数据存储方面中并没有明显的特性,所以在实际中普通二叉树的应用场景并不多;BinarySearchTree二叉搜索树,顾名思义这种类型的二叉树对搜索有着比较大的优势;原创 2023-12-08 01:01:28 · 399 阅读 · 11 评论 -
『 C++类与对象 』多态之单继承与多继承的虚函数表
多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种:单继承多继承棱形继承棱形虚拟继承不同的继承方式其虚表的形式也不同;以下操作均为在CentOS7_x64机器上的操作。原创 2023-11-23 20:26:54 · 170 阅读 · 9 评论 -
『 C++类与对象 』虚函数与多态
多态对通俗的概念来说就是一个事件被多种类型的角色触发从而产生的不同结果称之为多态;就以学校为例;老师进学校是为了教课;学生进学校是为了上课;不同的角色对同一个事件的触发从而产生出不同的结果;多态是在不同继承关系的类对象去调用同一成员函数所产生的不同行为;在虚函数中有一种特殊的虚函数为纯虚函数,纯虚函数即为只有一个虚函数的声明但是虚函数未定义且函数名后跟=0即为纯虚函数;语法 –而包含纯虚函数的类被称为抽象类,也叫做接口类;抽象类不能被实例化出对象。原创 2023-11-20 17:17:54 · 113 阅读 · 8 评论 -
『 C++类与对象 』多继承与虚继承
如果从上个例子不能很好的观察到所谓的数据冗余和二义性的问题,接下来我将再举一个例子,并以GDB调试的形式观察其中的问题;,假设一个基类拥有多个派生类,并在多次继承之后又将其若干个派生类(或者其子类)多继承了一个派生类即为棱形继承;之间的内存中其中一处所存储的为一个指针,而该指针指向的位置也存储了一个指针,而这个指针正是存储偏移量。当需要对虚继承中共有的成员数据进行操作时将以特定的形式对这个共有的数据进行访问;的版本中,就提出了多继承的概念,多继承允许一个派生类是由多个基类继承而来;原创 2023-11-09 17:34:56 · 111 阅读 · 3 评论 -
『 基础算法题解 』之双指针(下)
即给定一组升序数据(数组price),并给出一个变量target,要求找出和为target的两个数;所指位置数据>0时,则代表cur后区间的数据中已经不满足三数之和>0,所以。题目大差不差,与之不同的是多一层循环用来固定双指针外的另一个数;由于数据已经是升序已经具有单调性,所以不需要再进行排序;,具体的思路为将数组首先进行一次排序使其具有单调性;小优化:由于数据经排序后已经具有单调性,所以当。所指位置数据>0时,可以直接跳出循环;该双指针的解法即为创建两个指针分别为。该题的双指针的思路与。原创 2023-10-27 19:19:15 · 111 阅读 · 5 评论 -
『 C++类与对象』继承
继承的机制为,允许在以该类为基础上对类进行扩展,增加功能;通常原来也就是被用来继承的类称之为父类或者是基类,而通过继承产生的新类被称为子类或者是派生类;派生类将会以继承规则或者是基类原有的访问限定符为限定对属性进行一定的调整;原创 2023-10-27 15:48:38 · 126 阅读 · 9 评论 -
『 基础算法题解 』之双指针(上)
在这一题目的描述之中,有个奇妙的点,为什么在这个规则之下必定会出现循环且不会有第三种结果(即无限不循环);指针来说,该指针用来划分非0元素与0元素,但是在最初始的情况下并没有非0元素区间,所以该段区间不存在,(由于具有单调性,表示该left所指向位置的数据与右侧的任意数据相加都不能组成一个合规的三元组和);该题的大概为给定一个数组,并给定一个对应的规则,使得数组按照规则划分为若干个区间;指针为已处理区间内,非0元素与0元素的分界线,即最后一个非0元素的位置;原创 2023-10-24 19:22:19 · 93 阅读 · 3 评论 -
『C++ - 模板』之模板进阶
模板的优缺点优点模板采用了泛型编程,可以进行代码的复用从而可以高效的进行开发;模板增强了代码的灵活性;缺点模板的使用将会造成代码膨胀;即在原来的编译过程中只需要进行语法的判断,而对于模板而言则多增加了一个步骤为模板的实例化;不同的类型实例化出的代码也不同从而导致代码膨胀,同时也导致了编译时间变长;当使用模板进行开发时,若是出现模板的编译错误,则大量的错误信息使在开发过程中不能精确找到错误位置;原创 2023-10-22 15:50:25 · 183 阅读 · 5 评论 -
『C++ - STL』之优先级队列( priority_queue )
什么是优先级队列,从该名中可以知道他一定有队列的一定属性,即先入先出(LILO),而这里的优先级则可以判断出它的另一个特点就是可以按照一定的条件将符合该条件的先进行出队,这就是优先级队列;而在数据结构中有一个支持该操作的结构 - 堆( heap );而在STL中,这个优先级队列( priority_queue )也正是堆;原创 2023-10-17 11:54:26 · 499 阅读 · 4 评论 -
『C++之STL』双端队列 - deque
双端队列,Double-ended queue,简称为deque是一种线性结构的一种容器;在数据结构中出现的顺序表与链表,或者栈与队列都算是线性结构;在结构中,它与vector相比较会相似一些;但是在实际当中,双端队列 - deque 包含了vector与list的优点;vector(顺序表)支持随机访问,空间连续;尾插尾删效率高,但是头部插入删除以及中间插入删除的开销过大,扩容代价高;list(链表)任何位置的插入删除效率高,无扩容代价,但是内存碎片较多,且不支持随机访问;原创 2023-10-15 16:22:40 · 314 阅读 · 1 评论 -
「C++之STL」关于在模拟实现STL容器中的深浅拷贝问题
在学习STL容器中,不仅需要学会容器的使用,同时也需要了解容器的大体框架以及各个函数的模拟实现才能更好的去了解这个容器;原创 2023-09-28 21:13:55 · 199 阅读 · 13 评论 -
【C++】STL之String模拟实现
该重载在实现过程中应该首先注意string 的扩容,若是盲目扩容2倍的话可能会出现,该字符串长度仍比2倍的_capacity要大,还有一种可能为,该字符串的长度只有1,若是已有的_capacity容量已经很大的话仍扩2倍则可能出现内存利用率不高等情况;共用同一块空间的危害若是处理好其实问题不大,但是唯一的问题在于析构部分,在一个对象的生命周期结束时将会去调用它的析构函数,而两个对象的_str指针都指向同一块空间,则会造成对一块空间的重复释放;原创 2023-09-14 21:03:35 · 177 阅读 · 25 评论 -
【C++】命名空间 ( namespace )
命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突;命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效避免了命名空间的污染;从上面可知命名空间的作用,既然命名空间能够有效防止命名冲突,那该如何定义命名空间?在定义命名空间时,应该使用namespace修饰且在该修饰词后定义名字并在其后跟**{ }**在{ }内的元素即为该命名空间的成员;原创 2023-07-18 20:42:55 · 8495 阅读 · 12 评论