- 博客(57)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 网络编程学习(一)_TCP状态转换(11种状态)
一、TCP状态转换图(11种状态)二、TCP三次握手和四次挥手过程图TCP三路握手过程的状态变化。 1、CLOSED:起始点,在超时或者连接关闭时候进入此状态,这并不是一个真正的状态,而是这个状态图的假想起点和终点。 2、LISTEN:服务器端等待连接的状态。服务器经过 socket,bind,listen 函数之后进入此状态,开始监听客户端发过来的连接请求。此称为应用程序被动打开
2020-11-01 20:09:31
363
1
原创 C++实现LRU算法
LRU 算法的基本思想是,当缓存空间已满时,将最久未被访问的数据项淘汰出去,为新的数据项让出空间。如果数据项存在于缓存中,更新该数据项的值,并将其移动到链表头部,表示它是最近被访问的数据项。LRU 算法通过维护数据项的访问顺序,将最近访问的数据项放在链表的前面,保证了频繁访问的数据项能够快速被命中,提高缓存的命中率。通常选择双向链表,其中链表头部表示最近访问的数据项,链表尾部表示最久未被访问的数据项。如果数据项存在于缓存中,将该数据项从当前位置移动到链表头部,表示它是最近被访问的数据项。
2023-06-28 17:51:58
507
原创 C++完美转发解析
完美转发(Perfect Forwarding)是 C++11 中引入的一种编程技巧,其目的是在编写泛型函数时能够保留参数的类型和值类别(左值或右值),从而实现更为高效且准确地传递参数。通过使用右值引用和模板类型推导,完美转发允许我们在函数中以原始参数的形式将参数传递给其他函数,而不会发生不必要的拷贝操作,从而提高性能。
2023-06-15 16:54:51
2635
原创 C/C++基础
而动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。而内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。而内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。
2022-09-28 15:21:37
515
原创 C语言丨const关键字的用法总结
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性。在实例化对象的时候,添加const关键字,就是const对象,const对象只能访问类中的const成员变量和const成员函数。对变量进行修饰是const最基本的用法,const不仅可以修饰int,float等类型的变量,还能对指针变量进行修饰。.........
2022-08-30 17:01:21
493
原创 linux和windows目录相互映射
一、linux文件夹映射到windows**安装sambayum install -y samba将root用户添加到samba中smbpasswd -a root设置selinux:(或者关闭selinux)chcon -t samba_share_t /home/work/ -R修改配置文件etc/samba/smb.conf增加[work]comment = workpath =/home/work/valid users = @rootread list = @root
2021-12-06 19:04:04
5991
原创 Linux C++多线程同步
文章目录一.互斥锁二.条件变量三.读写锁四.信号量背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include<iostream>#include<pthread.h>#include<unistd.h>using namespace std;int ticket_sum = 20;void * sell_ticket(void * arg){ for(int i=0; i<20; i+
2021-01-25 15:19:11
163
原创 Linux C++ 多线程编程实例
Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux 下pthread的实现是通过系统调用clone()来实现的。clone()是 Linux所特有的系统调用,它的使用方式类似fork。1、线程创建pthread_createint pthread_create(pthread_t *restrict tidp,const pthread_attr_t *r
2021-01-14 17:12:40
458
原创 字符串匹配算法KMP详细解释
1、蛮力匹配法问题很简单,当然也有最直接、最直观也是最好想到的方法,蛮力串匹配。即两个字符串像物流传送带一般,主串固定,子串一步步像前移动,一位位匹配比较,直到完全匹配找到想要的结果的位置。效果即如下图所示,将T长度为m的n-m+1个子串逐一和P进行比对,发现完全每一位匹配的位置即我们需要的结果。图中P字符串上黑色表示该位已成功匹配,而绿色表示当前匹配未成功的位置,白色表示未匹配字符位置。int matchString(char * T, char * P, int lenT, int lenP){
2020-12-30 16:51:55
237
原创 七大查找算法
文章目录1、顺序查找2、二分查找3、插值查找4、斐波那契查找5、树表查找6、分块查找7、哈希查找查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找算法分类:1)静态查找和动态查找;注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。2)无序查找和有序查找。无序查找:被查找数列有序无序均可;有序查找:被查找数列必须为有序数列。1、顺序查找顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构。
2020-12-29 17:00:49
639
原创 二叉树的详解与常见算法实现
文章目录一、 二叉树的基本概念一、 二叉树的基本概念**二叉树:**二叉树是每个节点最多有两个子树的树结构。**根节点:**一棵树最上面的节点称为根节点。父节点、子节点:如果一个节点下面连接多个节点,那么该节点称为父节点,它下面的节点称为子 节点。**叶子节点:**没有任何子节点的节点称为叶子节点。**兄弟节点:**具有相同父节点的节点互称为兄弟节点。**节点度:**节点拥有的子树数。上图中,13的度为2,46的度为1,28的度为0。**树的度:**所有结点的度数的最大值。二叉树的度小于等
2020-12-23 17:15:54
3948
1
原创 链表操作详解(C++)
文章目录1.结构体2.链表头部插入3.链表尾部插入5.获取链表长度9.链表逆序(循环方法)10.链表逆序(递归方法)11.两个链表有序合并后依然有序(循环方法)12.两个链表有序合并后依然有序(递归方法)13.判断一个链表是否有环14.找到环的入口点15.环上节点个数16.判断两个链表是否相交并找出交点1.结构体struct Node{ int Data; Node * next;};2.链表头部插入Node * Insert_head(Node * & head, i
2020-12-18 18:36:43
1179
1
原创 23种设计模式(C++)
文章目录一、设计模式的分类二、设计模式的六大原则1.单一职责原则2.里氏替换原则3.依赖倒转原则4.接口隔离原则5.迪米特法则6.合成复用原则三、具体设计模式1.工厂模式2.策略模式3.适配器模式4.单例模式5.原型模式、模板方法模式6.建造者模式7.外观模式、组合模式8.代理模式9.享元模式10、桥接模式11.装饰模式12.备忘录模式13.中介者模式14.职责链模式15.观察者模式16.状态模式总结和整合了网上一些设计模式资料。https://blog.csdn.net/qq_33854260/art
2020-12-11 18:39:37
1338
原创 常见设计模式-状态模式(C++)
状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。它有两种使用情况:(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。使用场景1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的条件结构。State模式将每一
2020-12-11 17:49:45
84
原创 设计模式-职责链模式(C++)
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。使用场景1、有多个对象可以处理同一个请求2、在不明确指定接收者的情况下,向多个对象中的提交请求3、可动态指定一组对象处理请求考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请
2020-12-10 18:54:13
122
1
原创 设计模式-中介者模式(C++)
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。使用场合1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解;2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象;3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。优缺点1、减少了子类生成,Mediator将原本
2020-12-10 17:51:13
67
原创 设计模式-备忘录模式(C++)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态使用场景1、需要提供保存和恢复数据的相关状态场景2、提供一个可回滚rollback操作3、需要监控的副本场景。4、数据库连接的事务管理就是备忘录模式举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原
2020-12-10 17:45:30
82
原创 设计模式-装饰模式(C++)
动态地给一个对象添加一些额外的职责。适用场景1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。2、处理那些可以取消的职责。3、不能或不好采用生成子类的方法扩充职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明
2020-12-09 18:48:59
120
原创 设计模式-桥接模式(C++)
将抽象部份与它的实现部份分离,使它们都可以独立地变化。常用的场景1.当一个对象有多个变化因素的时候,考虑依赖于抽象的实现,而不是具体的实现。如上面例子中手机品牌有2种变化因素,一个是品牌,一个是功能。2.当多个变化因素在多个对象间共享时,考虑将这部分变化的部分抽象出来再聚合/合成进来,如上面例子中的通讯录和游戏,其实是可以共享的。3.当我们考虑一个对象的多个变化因素可以动态变化的时候,考虑使用桥接模式,如上面例子中的手机品牌是变化的,手机的功能也是变化的,所以将他们分离出来,独立的变化。优点1.
2020-12-09 17:40:20
61
原创 设计模式-享元模式(C++)
享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。常用场景1.当系统中有大量的细粒度对象实例,而且这些对象实例中有一些属性是重复的情况下,考虑使用。文本编辑器,输入法之类的常用应用。优点1.提高了系统的效率,减小了内存的消耗。2.减少了重复代码。3.减少了
2020-12-09 17:05:56
82
原创 设计模式-组合模式(C++)
将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,不论是子公司,还是直属的财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。优点将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。使用场景
2020-12-09 10:54:09
107
原创 设计模式-外观模式(C++)
外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对外观模式是这样说的:将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。细细的理解这句话;子系统中的一组接口,就好比上面举得例子中的语法分析,生成中间代码,生成汇编代码,链接成可执行程序或库;外观模式定义的一个高层接口,就好比上面说的Build按钮,通过这样的一个Build按钮,让编译器更加容易使用,对于这一点,从Linux C++/C转Windows C++/C的
2020-12-09 10:49:27
127
4
原创 常见设计模式-代理模式(C++)
定义:为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理(2)虚代理,(3)保护代理,(4)智能引用。适用场景根据目的和实现方式的不同,代理模式可分为很多种,常见的有:远程代理(Remote Proxy)为一个位于不同地址空间的对象提供一个本地代理,对代理的方法调用会导致对远程对象的方法调用。ATM 就是一个例子,ATM 可能会持有(存在于远程服务器中的)银行信息的一个代理对象。虚拟代理(Virtual Proxy)使用虚拟代理,代理可以作为一个(资源消耗较大的)对象
2020-12-08 18:52:05
103
原创 设计模式-建造者模式(C++)
建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP)。《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。应用场景1.对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。2.当一个复杂系统的子系统很多时,
2020-12-07 18:34:13
76
原创 设计模式-原型模式(C++)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在Prototype定义了克隆自身的Clone接口,由派生类进行实现,而实现原型模式的重点就在于这个Clone接口的实现。PrototypeA类继承自Prototype类,并实现Clone接口,实现克隆自身的操作;同时,在PrototypeA类和中需要重写默认的复制构造函数,供Clone函数调用,Clone就是通过在内部调用重写的复制构造函数实现的。在后续的编码过程中,如果某个类需
2020-12-07 18:32:05
50
原创 设计模式-模板模式(C++)
定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。实现方案:将算法/逻辑框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。注:策略模式,解决的是相同的问题,只是其方案是将各个接口封装为类,通过委托/组合方式解决问题使用场景多个子类有共有的方法,并且逻辑相同/逻辑相同,细节有差异对重要,复杂的算法,可以讲核心算法设计为模板方法,周边细节由子类实现重构时,经常使用的方案,将相同的代码抽象到父类,通过钩子函数约束行为。#in
2020-12-07 18:30:34
55
原创 常见设计模式-适配器模式(C++)
适配器模式可以将一个类的接口转换成客户端希望的另一个接口,使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作。通俗的讲就是当我们已经有了一些类,而这些类不能满足新的需求,此时就可以考虑是否能将现有的类适配成可以满足新需求的类。适配器类需要继承或依赖已有的类,实现想要的目标接口。缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直
2020-12-04 18:36:22
74
原创 常见设计模式-观察者模式(C++)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。在以下任一情况下都可以使用观察者模式:1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变
2020-12-04 15:01:53
93
原创 常见设计模式-策略模式(C++)
在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用户需要知道各种算法的具体情况。就像上面的加班工资,不同的加班情况,有不同的算法。我们不能在程序中将计算工资的算法进行硬编码,而是能自由的变化的。这就是策略模式。方式一:直接通过参数指定,传入一个特定算法的指针。class Strateg
2020-12-03 18:51:05
132
原创 常见设计模式-工厂模式(C++)
1、简单工厂模式简单工厂模式是属于创建型模式,又叫做静态工厂方法(static Factory Method)模式,简单工厂模式是由一个工厂对象决定创建出来哪一种产品类的实例.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一类产品类(这些产品类继承自一个父类或接口)的实例。打个比方假设有一个工厂,他能生产出A、B两种产品。当客户需要产品的时候一定要告诉共产是哪种产品,是A还是B。当新增加一种新产品的时候,那么就要去修改工厂的类。class Product{public:
2020-12-03 16:53:09
89
原创 常见设计模式_单例模式(C++)
单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。应用场景单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统
2020-12-02 17:47:19
78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人