自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux-网络】初识计算机网络 & Socket套接字 & TCP/UDP协议(包含Socket编程实战)

Socket(套接字) 是计算机网络中进程间通信的接口,它提供了一种在网络中不同主机上的进程之间进行数据收发的机制。在网络通信过程中,Socket充当了应用层与传输层之间的桥梁,帮助应用程序与底层网络协议进行交互,使开发者无需关心底层的复杂细节,只需通过Socket提供的接口进行数据传输。

2025-01-25 04:21:40 4078 76

原创 【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

如果说进程是操作系统资源分配的基本单元,那么线程就是资源调度的基本单元,也是程序执行的基本单元。我们可以把进程看作工厂,资源就是工厂内部的原材料与各种机械设备,而线程就是工厂里的工人。因此如果进程只有一个执行流,那它也是一个线程,称之为主线程,我们在进程中创建线程其实就是在主线程下创建其他线程,线程与进程的关系如下图:说完了线程的概念,我们下面来说一下线程的操作。1.线程池的初始化:线程池通过PoolInit创建多个工作线程,这些线程通过执行thr_start来不断地获取并处理任务。2.任务队列。

2025-01-18 15:11:34 3372 70

原创 【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞

上一章我们谈论了进程间的通信机制,由于不同进程之间有时需要相互协作,所以引入了进程间通信的概念,使得不同的进程可以共享同一份资源,完成数据的传输。进程间通信时是用户层面的通信,为什么这么说呢,因为在这个过程中,用户空间的进程通过特定的通信机制来传递数据或信息,而这些操作并不涉及操作系统的内核执行逻辑,通信的内容也是由用户自定义的。然而系统层面也需要通信,比如一个进程执行异常时,操作系统必须对异常进程进行处理,那么有哪些处理方式呢?

2024-12-18 23:52:11 3859 141

原创 【Linux】进程间通信的秘密通道:IPC机制详解

进程间通信(IPC)是操作系统中不同进程之间交换数据和信息的方式。由于每个进程都有独立的内存空间,无法直接访问其他进程的资源,因此需要通过IPC机制实现数据共享。

2024-12-13 23:29:42 3805 122

原创 【看海的算法日记✨优选篇✨】第四回:前缀和之妙

前缀和算法通过预处理一个前缀和数组来避免重复计算,快速求解数组中任意区间的和。在一维情况下,前缀和数组存储从数组起点到当前位置的累计和,从而能够高效地计算区间和;在二维情况下,通过构建二维前缀和数组,可以快速计算矩阵中任意子矩形的和。

2024-12-09 13:52:52 3426 55

原创 【Linux】动态库与静态库:代码复用的利器

在程序开发中,库是代码复用的重要工具,无论是标准的C/C++库,还是为特定功能编写的自定义库,程序员都依赖这些库来节省时间,提高开发效率。在库的实现上,有两种常见的形式——动态库与静态库。这两种形式在代码管理、性能、可维护行等方面都有所区别,本篇文章会一一介绍这两种库的实现方式以及各自的特点。

2024-12-07 17:34:58 2997 111

原创 【Linux】文件操作的艺术——从基础到精通

在 C 语言中,标准库函数提供了较高层次的抽象,使得文件操作变得简便易用。我们通过 fopen() 打开文件,利用 fread() 和 fwrite() 进行读写操作,并通过 fclose() 关闭文件。这些操作的实现背后,实际上是依赖于操作系统提供的低级系统调用,如 open()、read()、write() 和 close()。这些系统调用直接与操作系统内核进行交互,提供了更精细的控制。

2024-12-02 14:31:28 6368 128

原创 【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道

二分算法是一种经典且高效的查询方法,核心在于通过不断将查找范围缩小为一半,从而大幅降低查找的时间复杂度,从 O(n)优化为 O(log⁡n)。要注意的是,算法在实际应用中有几个关键细节,如左右临界的处理、中点的选择,以及避免死循环的循环条件设计。我通过多个具体例题,我们可以体会到二分算法的灵活性和强大之处:其不仅适用于有序数组,还可在满足一定性质的无序场景中巧妙运用。

2024-12-01 07:00:00 4808 92

原创 【Linux】剧幕中的灵魂更迭:探索Shell下的程序替换

上一篇博客我们讲到了进程的诞生过程:父进程调用fork创建子进程,子进程执行父进程相同的程序。但是很多时候我们希望子进程执行另一个程序,此时就要用到exec函数调用,子进程中调用exec函数之后,该程序就会被调用的程序代替,这就是程序替换:

2024-11-28 14:55:30 4865 121

原创 【Linux】进程的生命之旅——诞生、消逝与守候(fork/exit/wait)

特性wait()waitpid()等待目标等待任意子进程的结束可以指定特定的子进程(通过pid参数)阻塞与非阻塞总是阻塞,直到至少有一个子进程结束可以通过WNOHANG使其非阻塞灵活性较少灵活性,只能等待任何一个子进程更灵活,可以等待指定的子进程或进程组选项没有额外选项支持更多控制选项,如WNOHANG返回值返回一个子进程的 PID返回指定子进程的 PID,或者-1错误错误处理如果没有子进程,返回-1如果没有子进程,返回-1。

2024-11-24 14:16:06 5442 115

原创 【看海的算法日记✨优选篇✨】第二回:流动之窗,探索算法的优雅之道

滑动窗口算法通过动态维护子区间的特性,在遍历的过程中高效地找到问题的解。它的核心思想是利用两个指针构建窗口,并根据问题的条件灵活调整窗口大小。相比暴力枚举,滑动窗口在优化时间复杂度方面有显著优势,非常适用于处理连续性问题,如子数组、子字符串及其变形的场景。以上就是【优选算法篇·第二章:滑动窗口】的全部内容,欢迎指正~码文不易,还请多多关注支持,这是我持续创作的最大动力!

2024-11-21 12:26:35 8743 78

原创 【Linux】进程字段、环境变量与进程地址空间

在Linux下,可以使用ps指令显示当前系统运行的进程信息,包含进程状态、资源使用情况等内容ps的-l选项可以显示长格式信息,包括F(标志)、S(状态)、UID、PID等详细字段:

2024-11-17 16:29:07 3660 86

原创 【Linux】详解僵尸进程与孤儿进程(Z僵死状态引发的内存泄漏与处理办法)

本篇篇博客详细讲解了僵尸进程和孤儿进程的产生过程与处理办法。僵尸进程产生于子进程退出后,父进程未调用wait()收集其退出状态,导致进程表中的信息未被清理,从而造成资源泄漏。孤儿进程则是父进程提前结束,子进程在没有父进程的情况下继续执行,操作系统将其交给init进程处理,以确保资源的正常回收。以上就是【详解僵尸进程与孤儿进程】的全部内容,欢迎指正~码文不易,还请多多关注支持,这是我持续创作的最大动力!

2024-11-16 21:12:40 3404 41

原创 【看海的算法日记✨优选篇✨】第一回:双指针灵动,妙解序列之谜

何为双指针?双指针算法是指用两个指针来遍历数组或链表的算法技巧,一般可分为同向双指针、对向双指针以及快慢双指针。双指针算法的核心是减少时间复杂度,提高算法效率,下面会有例题进行印证。注意:双指针算法不一定就是使用指针进行遍历,也可以通过下标等其他形式,双指针只是一个思想,并不只局限于指针。

2024-11-14 01:56:50 6603 73

原创 【C++】详解RAII思想与智能指针

上一篇关于异常处理的文章,我们提到,异常处理是存在内存泄漏风险的,由于异常捕获会导致程序运行时执行流的跳转,并且在某些资源释放之前就进行了跳转,此时就会引发内存泄漏。什么是内存泄漏呢?内存泄漏是指程序在运行的过程中,动态分配的内存被占用但没有得到释放,从而导致资源不能被回收,最终可能导致系统性能下降甚至崩溃。

2024-11-09 19:34:49 4404 67

原创 【C++】异常处理机制(对运行时错误的处理)

我们在编写程序的时候不可避免地会造成一些错误,有些错误是编译器可以帮我们找出并纠正的,而有些错误则需要我们自己自行处理。编译器负责静态检测,只能检查代码中明显的语义和语法错误,对于运行时的错误处理则需要我们设置适当的错误处理机制。

2024-11-08 15:46:40 3057 27

原创 【C++】lambda表达式的理解与运用(C++11新特性)

C++11引入了 lambda 函数这个概念,用来快速地构建一个闭包,闭包是函数式编程的一个概念,在函数式编程中使用闭包来实现一些高阶函数。闭包是指一个匿名函数以及它所捕获的上下文环境的组合。闭包允许你在函数中捕获并使用周围作用域的变量,从而实现更灵活的函数行为。使用 lambda 可以带来以下好处:1.通过创建lambda对象,可以快速的构建比如谓词函数这种短小并局部使用的函数。这样可以使这部分,不污染全局命名空间2.通过lambda对象可以快速地创建一个可调用对象。

2024-11-07 12:45:07 2178 68

原创 【C++】对左值引用&右值引用&&的深入理解(右值引用与移动语义)

在区分左右值引用之前,我先补充一下对引用的理解。引用,我们需要了解的是,为什么C语言没有引用,而C++有呢?在C语言中,设计者希望语言保持简单并且支持直接操作内存,因此选择使用指针完成数据的传递,通过指针,C语言可以实现对变量的直接访问和修改;在C++中,引入了更高级抽象机制,引用作为一种高级抽象比指针更安全、易用,并且在实现参数传递和返回值时不需要&、*操作符,更符合直观语义,便于面向对象编程。

2024-11-04 19:22:29 7470 93

原创 【C++】布隆过滤器的概念与特点解析

为了方便用户之间的搜索,某应用不允许用户的id重复,现在用布隆过滤器存储着所有用户id的存储情况,用户注册时如果预输入id已存在,则要求更换id(可能预输入id并不存在,但是发生假阳性误判),由于假阴性误判的杜绝,用户的id一定不会相同(已存在的id肯定不会被误判为不存在,而被新用户注册)A与B有一个哈希值7相同,B的删除会使7的bool值置0,这就会导致A被误判为不存在,即假阴性误判,为了避免这种情况发生,布隆过滤器不允许删除元素。频繁的扩容必然导致内存的浪费,那么面对字符串的存储问题,该怎么解决呢?

2024-11-02 15:12:11 2799 40

原创 【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)

位图只存储数据的状态(即是否存在),而不存储数据本身的值,但是我们仍可以根据位图的位索引位置间接查询到数据本身。比如要记录整数。

2024-11-01 19:01:43 4458 48

原创 【C++】红黑树的Iterator改造以及map&set的模拟实现与封装

前面的博客我们介绍了红黑树的底层原理并手撕了一个自己的红黑树,但是这与库里的红黑树还是差了些意思(博客跳转链接要想实现一个完整的红黑树,我们还得实现迭代器的功能,使其可以访问红黑树的每个节点,方便遍历、修改等操作。实现iterator时,begin和end的定义方式决定了如何遍历树中的元素,那么问题来了,begin和end分别该如何定义呢?我们知道,红黑树是一棵二叉搜索树,它中序遍历的结果是一个有序数列,那么我们可以通过begin获取红黑树中最小的元素,end。

2024-10-31 19:07:31 2969 29

原创 【C++】有关哈希的面试题自测

关于哈希结构的介绍可以看这两篇博客:哈希结构的介绍,哈希冲突的解决办法

2024-10-28 15:34:46 1625 10

原创 【C++】哈希冲突的解决办法:闭散列 与 开散列

上一篇博客提到了,哈希函数的优化可以减小哈希冲突发生的可能性,但无法完全避免。本文就来探讨一下解决哈希冲突的两种常见方法:闭散列和开散列

2024-10-28 14:48:20 3079 8

原创 【C++】unordered关联式容器 与 哈希结构(哈希函数的设计)

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器(set、map、multiset、multimap)在查询时效率可到到 O(logN) ,每次查找都需要比较节点的左右子树,当要查找的数据刚好位于叶子节点处时,就要比较树的高度次,当树的高度较大时,查找效率也不理想。理想的查找效率是:1次就可以将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,它们虽然不能保证每次都能1次找到数据,但是它们需要进行的比较次数比红黑树少的多。

2024-10-27 19:41:14 2753 5

原创 【C++】红黑树万字详解(一文彻底搞懂红黑树的底层逻辑)

红黑树的底层结构在代码实现中使用节点结构体和数来表示。节点结构体 保存每个节点的数据、指向左右子节点、父节点的指针、以及平衡因子;树类管理插入、删除等操作。// 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲T _data;// 节点的值域// 节点的颜色在节点的定义中,我们将节点默认颜色给成红色,这是因为如果定义成黑色的话,根据性质4,每一次插入节点都需要重新调整树,而定义成红色,就只需要在父节点也为红色时进行调整,一定程度上保证了插入的效率。

2024-10-24 17:52:52 2867 6

原创 【C++】AVL树(二叉平衡搜索树,超级详细图解底层原理,一遍就会)

AVL树的底层结构在代码实现中使用节点结构体和数来表示。节点结构体 保存每个节点的数据、指向左右子节点、父节点的指针、以及平衡因子;树类管理插入、删除等操作。

2024-10-14 21:36:31 3017 3

原创 【C++】map详解(键值对的概念,与multimap的不同)

set是一个集合容器,存储的是唯一的元素,元素本身就是它的值,且元素按照某种顺序进行存储。set不允许存储重复元素,常用于去重场景。map是一种键值对容器,存储的是成对的数据(key-value pairs),其中键(key)是唯一的,值(value)可以重复。map主要用于通过键快速访问对应的值。键值对的概念(Key-Value Pair)是指一种数据结构,其中每个数据项都由两个部分组成:键(key)和值(value)。键是唯一的,通过键可以快速找到对应的值。

2024-10-10 18:13:24 1967 1

原创 【C++】set详解(关联式容器、键值对,与multiset的区别)

关联式容器在之前的文章中,我们介绍过STL中的部分容器,比如:vector、list、deque等等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。也是用于存储数据的,但与序列式容器不同的是,其里面存储的是结构的,在数据检索时比序列式容器效率更高。键值对键值对是一种数据结构,用于存储和表示关联数据。SGI-STL中,键值对通常由std::pair来表示,其中first代表键second。树形结构的关联式容器与。

2024-10-09 20:41:01 1814 3

原创 【C++数据结构】二叉搜索树(超详细图解操作过程,超详细讲解代码实现)

有一种查找方法,具有极高的查找效率,时间复杂度仅为 O(log⁡n)。在每一步查找过程中都会将搜索范围减半,这就是二分查找。但是在实际应用中,我们并不经常使用二分查找。这是因为它只能在有序数组或有序数据结构上工作,如果数据是无序的,则需要先进行排序;而且它只适用于数组或连续存储的数据结构中。在实际运用中,我们更常用的是二叉搜索树(Binary Search Tree, BST),其查找时间复杂度也是 O(log⁡n),并且拥有高效的插入和删除操作。

2024-07-17 21:15:05 3686 2

原创 【C++】继承与多态相关11道面试题整理

继承与多态的相关知识点在面试中频繁出现,这里整理了一些常见的面试题,供大家学习参考

2024-07-15 17:38:49 1590 2

原创 【C++】多态相关(多态的概念、定义及原理,虚函数与虚函数表)

多态是面向对象编程中的一个核心概念,它允许不同类的对象通过相同的接口调用来执行不同的行为。通俗点来讲,就是多种形态,去完成某个行为,当不同的对象去完成时会产生出不同的状态。

2024-07-12 16:40:16 1608 2

原创 【C++】菱形继承、菱形虚拟继承、继承与组合

不过继承也有用武之地的,有 些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用 继承,可以用组合,就用组合。,如上面的继承关系,在student和teacher的继承person时使用虚拟继承,即可解决问题。此时就不存在了对_name访问不明确的问题,因为虚拟继承保证在整个继承层次中只存在一份基类的实例。继承是一种“is-a”关系,表示一个类是另一个类的特殊化。

2024-05-21 16:28:21 913 1

原创 【C++】继承相关(基类与派生类的继承关系以及细节整理)

如图:我们可以看到,student是子类,也叫派生类,他继承的是父类people,也叫基类,而public是继承方式,继承方式也可以是protected、private,和访问限定符是一样的。使用不同的继承方式继承的基类成员的访问权限是不一样的,具体关系可以看下面这张表:可以看出基类的私有成员在派生类中是不可见的,而其他成员的访问方式取决于基类中成员的访问限定符和继承方式。通常情况下,使用 public继承是最常见的方式,因为它保留了基类的接口,并且派生类可以访问基类的公共和受保护成员。

2024-05-13 18:58:43 2459 2

原创 【C++】非类型模版参数以及模版的特化

模版参数分为类型参数与非类型参数类型形参:跟在class或typename后面的参数类型名称。非类型形参:可以是整型、指针、引用、枚举等等。模板特化的作用在一般模板无法满足特定类型或特定值的需求时,提供针对特定类型或特定值的定制化实现。

2024-05-08 20:37:33 596 2

原创 【C++】stack&queue系列力扣刷题日志(232.用栈实现队列、225.用队列实现栈、155.最小栈、牛客JZ31.栈的压入弹出序列、150.逆波兰表达式求值)

熟练掌握stack和queue容器适配器,对解决一些特定问题有很大帮助。以上就是我整理的一些关于栈和队列的oj题解,欢迎在评论区留言,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉

2024-04-29 19:03:54 1687 1

原创 【C++】stack & queue的介绍使用以及模拟实现

stack的文档介绍stack 是一种容器适配器:它专门用于后进先出(LIFO)操作,例如压入和弹出元素。stack 实现了一种简化的接口,只允许在容器的一端进行元素的插入和提取操作。底层容器的封装:stack 封装了一个底层容器,该容器负责实际存储元素。stack 提供了一组特定的成员函数,用于访问其底层容器的元素,并将特定类作为其底层容器,元素在容器的尾部(栈顶)进行压入和弹出操作。底层容器的要求:stack 的底层容器可以是任何标准的容器类模板或者其他特定的容器类。

2024-04-29 15:37:54 1437 1

原创 【C++】手撕list(list的模拟实现)

我们在学习数据结构的时候,学过一个非常好用的结构,叫做带头双向循环链表,它不仅遍历非常地灵活方便,而且插入和删除操作的效率很高,弥补了单链表相较于数组的缺点。我们今天要讲的list模版底层就是带头双向循环链表。

2024-04-23 17:37:57 1923 1

原创 【C++】list的介绍及使用说明

和"std::vector"一样,“std::list”实现不同类型数据的管理也是通过模版类的机制实现的。当创建一个list对象时,可以通过模版参数来指定存储的元素类型。使用""来显式实例化指定存储的元素类型,例如“std::list”表示存储整数类型的链表,“std::list”表示存储双精度浮点型的链表…………return 0;

2024-04-18 21:07:31 1932 1

原创 【C++】理解vector的底层原理并模拟实现(手撕vector)

但是我们不仅要会用,还要理解它的底层原理,今天我们通过手撕一个自己的vector,来进一步加深对vector容器的理解。

2024-04-03 18:51:11 1922 1

原创 【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)

在实际运用中我们要熟悉vector的常见接口,在合适的场景中使用出来

2024-04-01 15:43:56 1163

空空如也

空空如也

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

TA关注的人

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