自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 使用模板方法设计模式封装 socket 套接字并实现Tcp服务器和客户端 简单工厂模式设计

模抽象类定了一个模板方法,这个方法通常包含对具体方法的调用,抽象类还定义了一些抽象方法,这些方法会在模板方法中被调用,但具体的实现由子类来提供(抽象类,也就是父类中,将这些方法都设置为纯虚函数,子类要重写纯虚函数),子类通过继承抽象类并提供抽象方法的实现,从而可以自定义模板方法中的某些步骤,当模板方法被调用时,它会按照定义的顺序依次调用抽象类中的抽象方法和具体方法。模板方法(Template Method)设计模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。

2024-06-24 23:23:22 1105

原创 C++ 网络套接字编程 tcp udp

UDP(用户数据报协议)和TCP(传输控制协议)是两种常用的套接字编程方式。UDP是一种无连接的、不可靠的传输协议。在UDP套接字编程中,数据被分割成数据报,并以尽力而为的方式发送。UDP套接字适用于需要快速传输数据,但对数据传输的可靠性要求不高的场景,如音频、视频、实时游戏等。UDP套接字编程简单,不需要建立连接,能够快速发送和接收数据,但无法保证数据的完整性和顺序性。TCP是一种面向连接的、可靠的传输协议。在TCP套接字编程中,客户端和服务器之间需要建立连接,并通过可靠的字节流传输数据。

2024-06-19 11:36:46 1124

原创 C++网络编程基础

要正确的发送消息,再同一时刻,只允许一台主机在局域网中发消息,因此,局域网中的设备少,越安全,局域网中消息是否能发送成功是基于概率的,因此也叫 以太网(例如运动会操场上,消息发不出去一直丢包,就是因为几千人都访问的是附近同一个基站,而当操场上只有几个人的时候,消息特别流畅)机器有大小端之分,大小端机器存储数据方式不同。大端是“正着存储”的,可读性较好,因此在网络传输时规定,所以到达网络的数据,必须时大端存储的,因此,如果是小端机,收发数据到网络时需要先转化为大端。

2024-06-10 10:20:38 1005

原创 有向图的拓扑排序

当有向图中,某个点的入度为 0 的时候,说明是没有一个点指向这个点的,那这个点就能作为起点指向其他点了,遍历结束后,这个点就可以删掉了(将 t 放在当前的最前面了),并将它指向的所有点的入度都减 1。此题只需要记录每个人物最快完成的时间即可:将所有入度为 0 的点放入队列,然后遍历所有出边,将遍历到的点的入度都减1,当一个点的入度减到 0 的时候,就可以加入队列。比如:生成一个可执行程序,需要经历预处理,编译,汇编,链接四步,后面的步骤必须在前面的步骤完成后才能执行。

2024-05-31 23:02:52 479

原创 背包问题汇总(01背包、完全背包、多重背包、分组背包)

背包问题汇总(01背包、完全背包、多重背包、分组背包) 背包问题是一个经典的组合优化问题,在计算机科学和应用数学中被广泛研究。给定一组物品,每种物品有自己的重量和价值,在限定的总重量内,选择其中若干个物品装入背包,使得装入背包中的物品总价值最大。

2024-05-29 16:27:09 635

原创 高精度算法(加减乘除)

高精度算法:用数组模拟 “大数运算”,实现大数的加减乘除

2024-05-28 19:46:03 312

原创 最小生成树 & 最近公共祖先模板

Prim 算法在稠密图中求最小生成树,Kruskal 算法适用于 `稀疏图` 求最小生成树(利用并查集),Tarjan 算法用于求并快速查询两个节点的最近公共祖先。

2024-05-24 09:44:46 523

原创 最短路问题算法模板

最短路问题 代码模板 Dijkstra、Bellman-ford、spfa、Floyd 等最短路问题算法模板

2024-05-20 19:34:29 906 2

原创 数组模拟实现链表

数组模拟实现单链表、双链表。数组模拟实现的作为算法中树和图常见的存储结构。

2024-05-02 20:17:52 600 6

原创 【LeetCode】每日一题 - 负二进制转化

【LeetCode】每日一题 - 负二进制转化 十进制转化为任意 x 进制/ -x 进制思路。

2024-04-28 12:51:16 450 8

原创 【LeetCode】每日一题 - 爱生气的书店老板

leetcode 每日一题——爱生气的书店老板

2024-04-23 23:11:57 408

原创 动态规划——最长递增子序列模板

最长递增子序列是指在一个序列中找到一个最长的子序列,使得子序列中的元素按照从小到大的顺序排列,本文讲解动态规划解决

2024-04-21 23:12:17 296

原创 01背包和完全背包(背包价值最大和背包恰好装满的价值最大)

你的背包~ 让我走的好缓慢—— 01 背包,完全背包问题 (价值最大和恰好装满并体积最大)代码模板

2024-04-21 20:06:24 744

原创 算法总结篇——BFS

BFS是广度优先搜索(Breadth-First Search)的缩写,是一种图遍历算法。它从给定的起始节点开始,逐层地向外扩展,先访问起始节点的相邻节点,然后再访问相邻节点的相邻节点,以此类推,直到遍历完所有可达节点。创建一个队列,并将起始节点入队;将起始节点标记为已访问;当队列不为空时,循环执行以下操作: a. 出队一个节点;b. 访问该节点;c. 将该节点的所有未访问相邻节点入队,并标记为已访问;遍历完成。

2024-04-21 16:54:33 2065

原创 算法总结篇 —— DFS(搜索、递归、回溯)

递归,回溯,搜索等算法详解及模板总结。

2024-04-21 16:04:10 1138

原创 2024年团队程序设计天梯赛模拟赛 L1 + L2

2024年团队程序设计天梯赛模拟赛 L1 ~ L2 题目及代码(除撒狗粮)

2024-04-17 22:45:46 1749 11

原创 天梯赛模拟赛 L2 —— 含茶量

ChatGPT(全名:Chat Generative Pre-trained Transformer)近期成为网络讨论的热点话题之一。本题就请你根据某社交网络中发帖的情况,统计每个人帖子中含有ChatGPT(不区分大小写)的数量(简称“含茶量”),找出最热衷于讨论这个话题的人,即含茶量排前三的人。

2024-04-16 23:31:14 1017 14

原创 第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结

第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结 个人总结:力扣刷了 200 多道题,感觉还是寄了。刷最多的动态规划没考,dfs 最后一步不会还是没做出来,很可惜...

2024-04-14 19:47:38 8215 28

原创 C++ 异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。while (1)try {catch (const Exception& e) // 这里捕获父类对象就可以// 多态。

2024-04-06 20:42:11 757

原创 【Linux】线程概念及线程互斥

本文介绍了线程的概念、优缺点及异常分析。创建线程、终止线程、等待线程、封装线程库。线程互斥及系统接口,封装线程互斥,实现自动化加锁解锁。 线程安全、死锁

2024-04-05 23:09:49 1154 2

原创 C++11新特性(二):更好用的 lambda 表达式和 function 包装器

C++11引入了lambda表达式,它是一种用于创建匿名函数的语法。lambda表达式可以被视为一个匿名函数对象,它可以在需要函数对象的地方使用。可以使用包装器 function 来解决解决在调用对象时候函数指针、仿函数、lambda 的不足之处!

2024-03-31 22:24:28 1321 3

原创 【Linux】信号量与信号

信号量与信号没有任何关系,它们是两个完全不同的概念!信号量维护一个计数器,表示可用资源的数量。信号是一种向目标进程发送通知进程的一种消息机制,本质就是软件,用来模拟中断的行为!信号是进程之间异步通知的一种方式

2024-03-25 23:11:45 1305 11

原创 进程间通信 之 共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再,一个进程通过系统调用 shmget 在物理内存中开辟一块空间,并通过页表映射到进程地址空间中,其他的进程也通过调用 shmget,并设置不同参数,就可以实现在物理内存中找到进程 A开辟的空间,并将这块空间通过页表映射到自己的进程地址空间中。自此,这多个进程通过访问自己的进程地址空间,就可以访问这块物理内存中的空间,也就实现了让不同的进程看到同一份代码!那么其他进程是如何做到可以找到进程 A 创建的共享内存的呢?

2024-03-19 22:25:35 896 1

原创 进程间通信 之 管道

管道是Unix中最古老的进程间通信的形式。它是一种基于文件的通信形式,我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。管道文件是一种纯内存文件,不需要刷新到磁盘。管道只允许单向通信,如果要双向通信的话,需要建立两个管道,“互相读写”!

2024-03-19 20:21:29 1022

原创 动态规划刷题总结(入门)

动态规划(dp)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的算法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

2024-03-11 21:57:36 1149

原创 【Linux】文件系统扩展——软硬链接

Windows 系统中的软件快捷方式就相当于一个软链接 硬链接和原文件都与这个 inode 相对应,删除其中的一个并不会使 inode 变得无效,在 inode 内部设引用计数,表明有几个映射关系,只有当没有文件名和 inode 映射时,才会真正的删除这个文件!从这张图中,可以看出软链接的 inode 和被链接文件的 inode 是不相同的,而硬链接的 inode 与被链接的文件 inode 是相同的。硬链接的 inode 与原文件的 inode 相同,说明硬链接并不是一个独立的文件。

2024-03-10 23:12:53 393

原创 【Linux】基础IO

每个操作系统级别的概念,都必须有操作系统级别的数据结构与之对应。我们常说的文件,一般指的是磁盘中的文件,要对文件进行操作,首先应该先将它加载到内存中,文件内容和文件属性都是文件的数据,操作文件,包括对文件内容做操作和对文件属性做操作!当我们要访问一个文件的时候,一般都是通过进程去访问,而文件是存在磁盘中的,所以肯定是进程通过操作次用来打开文件,那么操作系统一定要给进程提供调用文件的接口。

2024-03-04 22:31:29 1159

原创 【刷题】模拟

模拟类算法题。模拟算法:题目中已经告诉应该怎么做了,只需要模拟即可,思路比较简单,比较考察代码能力。一般先在草稿纸上模拟流程,如果直接写代码,容易忽视细节,并且不容易调试!优化策略:找规律!

2024-03-02 20:35:30 397

原创 【刷题】位运算

位运算的相关算法题。 ^ 异或运算是:两个数对应比特位相同为0,相异为1,也叫 不进位相加。只需要利用按位异或运算符进行不进位相加运算,然后每次加上它的进位即可!直到进位为0!

2024-03-01 22:35:15 463

原创 设计一个 shell 命令行程序

自己设计一个 Shell 命令行程序。因为我们在执行的时候是让myshell 产生的子进程在执行命令,而像 cd、export、echo 这种,只有让父进程 bash 自己执行才有效的,这种命令叫内建命令。内建命令就是 bash 自己执行的,类似于自己内部的一个函数,所以需要在进行进程替换前先判断用户输入的命令是否是内建命令,穷举出内建命令并以此比较,如果是某一内建命令就直接执行,如果不是内建命令就进行程序替换!附:进程替换(函数)接口。3、实现进程替换功能。

2024-02-24 21:15:29 1227

原创 进程终止与进程等待

Linux 进程终止和进程等待 通过 wait/waitpid 的方式,让父进程对子进程进行资源回收的等待过程。那为什么要进行等待呢?第一,可以解决子进程僵尸问题带来的内存泄漏问题(进程僵尸只有父进程回收才能解决,且不能被杀掉,所以这是目前必须使用进程等待解决的问题);第二,父进程创建子进程的目的,就是让子进程来完成任务,而父进程需要知道子进程任务到底完成的如何,就必须通过等待的方式来获取子进程退出的信息(两个数字:退出码和信号)这个退出信息也许并不是必须的,但是系统需要提供这样的基础功能!

2024-02-19 21:29:06 1002

原创 进程地址空间

每一个进程运行之后,都会有一个自己的进程地址空间的存在,即都要在系统层面有自己的页表映射结构。子进程会自动继承父进程的页表,直接浅拷贝继承父进程的页表,当子进程或父进程要改变数据时,操作系统会在物理内存中进行写时拷贝,修改改变数据的进程的页表中虚拟地址对应的物理地址,虚拟地址不受改变!1、一个进程在运行过程中,进程进行各种转换,各种访问,这个进程一定在运行,那么让进程以统一的视角看内存,所以任意一个进程,可以通过地址空间 + 页表的方式,将乱序的内存数据变成有序,分门别类的规划好。,那它到底是什么样的呢?

2024-02-18 14:01:03 408 1

原创 命令行参数和环境变量

环境变量和命令行参数 命令行参数是在用户在命令行中输入命令时,跟随命令一起输入的一些附加信息。这些参数可以用来配置命令的行为或传递一些数据给命令。让同样的程序在不同的命令行参数下运行出不同的结果!写一个程序,在 main 函数中打印出这些参数argc 为参数个数,argv 为命令参数列表。打印结果及分析如下:命令行参数,可以支持各种指令级别的命令行选项的设置。这样,我们就可以理解了,曾经学习的指令和选项之间的关系。

2024-02-15 21:37:11 776

原创 C++11新特性(一)

C++11新特性 在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中。

2024-02-09 19:13:52 820

原创 位图和布隆过滤器

例如要存储 N 个数据,并判断0~N 中某个数是否存在于给定的数据当中,一共开 N 个比特位数组的空间,遍历需要判断的数据群,0~N 中哪个数 n 存在,就将数组第 n 个下标对应的值置为 1,在查找数据 n 的时候,只需要判断下标 n 位置存储的值是否为 1 即可。在计算机中,比特是最小的存储单位,而计算机中处理数据的基本单位却是字节,所以需要在以字节为单位的数组中进行定位,找到这个数据对应的比特位在顺序上属于哪一字节,并将这个字节的对应比特位改为1(1字节等于 8 比特,那么一个整形就是 32 比特)

2024-02-04 20:56:23 893

原创 用C++实现一个哈希桶并封装实现 unordered_map 和 unordered_set

C++代码实现哈希桶 + 封装为 unordered_map 和 unordered_set

2024-02-03 12:44:43 1034

原创 C++ 哈希 开放定址法

哈希,是一种算法思想吗,它的核心是映射,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)。在STL 中,提供了两个使用哈希底层实现的容器 unordered_set 和 unordered_map,unordered是无序的意思。它们存储数据的方式类似于 set 和 map,但缺少了排序的功能

2024-01-31 21:30:56 1044

原创 利用红黑树实现并封装出STL-map、set

C++,红黑树对map和set进行封装实现。将红黑树作为一个基础的类模板,通过给这个类模板传递不同的参数,从而控制它所实现的容器。最主要的点是用自己的map和set通过传递不同的模板参数控制红黑树第二个模板参数 T 来确定传入的到底是 Key 还是 pair 类型的模板参数【泛型编程的思想】

2024-01-30 10:45:56 848

原创 红黑树底层实现

C++实现红黑树

2024-01-25 20:48:54 391

原创 AVL树底层实现

AVL树建立

2024-01-22 21:16:41 863 1

空空如也

空空如也

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

TA关注的人

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