- 博客(25)
- 收藏
- 关注
原创 引用的一些赋值的问题
21.const int&&赋值给int,可以,只是把值拷贝出去,如果对int进行修改,对const int&&没有影响。16.const int&赋值给int,可以,只是把值拷贝出去,如果对int进行修改,对const int&没有影响。6.int&赋值给int,可以,只是把值拷贝出去,如果对int进行修改,对int&没有影响。23.const int&&赋值给int&&,不可以,因为int &&只能绑定到右值。11.int&&赋值给int,可以,和int&复制给int一样,也是值拷贝。
2023-10-08 19:50:25
80
2
原创 记录一下学习马拉车算法的一些心得
第二个,就是2*pos-i这个位置回文串的左边界小于left,那i的dp值为什么是right-i,为什么不能继续扩张呢,想通了才发现,要是能扩张,那right值咋可能是现在的值,肯定更大了啊,因为left左边和right右边有相等的(i和2*pos-i之间的对称性)。第一个,这篇博客提到了i在pos和right之间的情况,以及i大于right的情况,笔者的疑惑是,pos和left之间的情况呢?i的遍历是递增的,pos的值都是之前遍历过的i值中的一个,i不可能小于pos,我是个傻x。
2023-10-05 16:22:54
62
原创 享元模式(Flyweight)——对象性能类、结构型模式
说实话,笔者是把这个模式跟线程池、内存池等池技术来进行类比的。即开辟一块内存,当需要一个对象时,先查查有没有,有的话就能直接用,没有的话就创建。所以享元模式有以下优点。在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价(主要指内存需求方面的代价)如何避免大量细粒度对象问题的同时,让外部客户程序仍然能透明地使用面向对象的方式来进行操作?享元模式的思路在于运用共享技术有效的支持大量细粒度的对象。
2023-09-27 16:53:41
85
原创 单例模式(singleton)——对象性能类、创建型模式
单例模式有几个特点,你所知道的构造函数和析构函数都得private,然后要public出一个Get和一个Delete函数用于获得对象和删除对象。注意,这俩得静态函数,不然在没构建出对象之前没办法调用。在软件系统中,存在一种特殊的类,必须保证他们在系统中只存在一个实例,才能保证逻辑正确性以及良好的效率。且这是设计者的责任,而不是使用者的责任。如何绕开常规的构造函数,提供一种机制保证一个类只有一个实例?直接上代码吧,这个代码转载自。懒汉模式(局部静态变量)饿汉模式(线程安全)
2023-09-27 15:51:18
82
原创 构建器模式(builder)——对象创建类、创建型模式
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。其实没啥好讲的,就是一样的思想,不过构建器模式就是专门用来创建对象的,而且是复杂对象。就是把构建过程放在一个Builder对象里边,解耦性更好,优点也和模板模式差不多。如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?看到上边这段话我的第一反应就是?
2023-09-27 14:57:43
110
原创 原型模式(Prototype)——对象创建类、创建型模式
在调用clone函数的时候,传一些不同车型的一些小特质,比如发动机啥的,达到一个原型能创建多种对象的效果。MainForm中的原型对象不是给你用的,当你要用的时候把它当一个工厂,拷贝他就行了,注意得是深拷贝,自己重写一下拷贝构造函数,默认拷贝用的是浅拷贝。当然,这个分场景的哈,如果你需要通过原型对象控制所有克隆对象,即通过对原型对象的修改扩散至其他对象,就用浅拷贝。在软件系统种,经常面临着“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
2023-09-27 11:46:02
33
1
原创 抽象工厂模式(Abstract Factory)——对象创建类、创建型模式
抽象工厂和工厂模式其实挺类似,都是把new给封装起来,但是使用场景略微不同,抽象工厂模式针对的是“一系列”相互依赖的对象。首先基类有connection、command、read三个,这三个还对应自己的工厂(抽象),对sql这一业务来说,派生了三个业务,还有三个工厂。如果再加个Oracle,直接原地爆炸!所以这就是抽象工厂要解决的一系列对象的创建问题,我们来看看是怎么做的。其实抽象工厂就是工厂模式的一点小延申,至于为什么用抽象工厂模式,理由也基本和工厂模式一样,大家可以去看看笔者之前分享的博客。
2023-09-27 11:14:07
53
1
原创 工厂模式(Factory)——对象创建类、创建型模式
直接传splitter解决了其中一个问题,防止代码冗余,有些对象创建起来是麻烦,要好多步骤。你只传一个进来的话(当然这个场景下是够用的),当你后边执行执行着发现,不行,我可能还得创建一个,要怎么办,再new?所以工厂模式,真的优雅!出现的问题是:第一,因为new这个代码比较简单,如果是创建比较复杂的对象,且要多次创建,在每个创建的时候是不是都要写一遍?第一个问题,这不是多此一举,代码中的变化点根本不可能完全消除,工厂模式,乃至全部的设计模式都是为了把变化的点赶在一起,当要修改的时候只需要改很少的地方就行。
2023-09-27 10:42:12
59
1
原创 桥模式(Bridge)——单一职责类,结构型模型
也就是后四个,这是基本功能,你要适配相应的平台,例如PC端,移动端等,那派生两个类咯。后来我才知道,李建忠老师的意思跟我想的不一样,桥模式他解决的是类太冗余了的问题。装饰器那个例子大家可能还记得,不管是Buffer和Crypto还是Network、File的,他们重写的都是read、write和seek函数。MessagerImp是用来做平台层面的适配的,Messager是用来做业务的,这就是两个方向了。由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。这跟装饰器有啥区别?
2023-09-26 21:51:30
85
原创 装饰模式(Democrator)——单一职责类,结构型模式
然后利用构造函数给stm赋值,这样我就不用操心stm具体是文件流啊还是什么流,Crypto类我要负责的就是加密,其他的怂管。并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。通过采用组合而非继承的手法, Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。Decorator模式的目的并非解决“多子类衍生的多继承”问题, Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。
2023-09-26 20:44:37
33
原创 观察者模式(observer/Event)——组件协作类、行为型模式
第一,拓展问题,我不想用ProgressBar了,想用黑窗口打点形式来显示进度,这里只能再定义一个WindowBar,然后再传进FileSplitter中,然后再设置值进去,繁琐。第二,如果有大量的进度条都要通知呢,这样设计满足不了,因为都是不同类型的,要一个一个去设置值。模板模式是提供一种通用的解决流程,说白了就是框架给你定好了,给你接口,步骤上的小区别你可以自己设计,对程序员更加友好。策略模式想解决的是代码的冗余问题,不需要的代码就不用写,避免if else或者switch这种语句的存在。
2023-09-26 17:50:52
38
原创 策略模式(strategy)——组件协作类,行为型模式
由于采用的是完成端口模型,这里得先在主对话框中的函数走一趟,然后去相应的子对话框。目前的实现方法呢,是Completion Key中有一个字段叫DlgID,也就是在主对话框中设计了一个函数,里边有一个switch结构,用于判断Completion Key中的DlgID到底是什么,然后再去相应的对话框下处理数据。在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持不使用的算法也是一个性能负担。第二,在该函数中支持了不必要的算法代码。
2023-09-26 10:42:30
55
原创 模板模式(Template Method)—— 组件协作类、行为类模式
主连接专门用来创建子连接,这里的子连接指不同子功能(文件管理,CMD管理、窗口管理等)所需的连接。step8,肉鸡创建一个Manager对象,处理服务端到来的数据,因为功能很多(删除文件,新建文件,传输文件)要针对不同功能进行处理,服务端创建的新对话框也有这个功能。step9,两者之间传输数据(construct构建数据包,send发送数据包,destruct拆解数据包,recv接收数据包)。step2,服务端那边点击了某一功能(以文件管理为例),向肉鸡发送消息,说要构建子连接。step1,构建主连接。
2023-09-26 09:56:13
29
原创 传指针和传引用的小差别(个人理解,希望各位指正)
引用和指针说白了都是传一个指针到被调函数中,传参效率是一样的(32位下是4字节,64位下是8字节)。为什么说传引用要更安全呢?1.引用肯定不为空,所以传引用进来足够安全,不需要像指针一样进行判空操作。2.引用不能改变指向,避免在函数执行过程中出现未知的问题。
2023-09-25 15:33:47
47
1
原创 讨论一下如何用UDP来实现可靠传输
这个问题其实回答起来都能想到在应用层层面来对UDP进行一定程度的设计与约束,从而达到可靠传输的效果。但在回答这个问题之前得弄清楚,为什么不用TCP这个现成的玩意儿而要用UDP,TCP的痛点在哪?
2023-09-25 11:37:26
313
1
原创 聊一聊share_ptr的线程安全性
is a来翻译一下:线程安全是一种用于多线程代码的计算机编程概念。线程安全代码仅以确保所有线程正常运行并满足其设计规范的方式操作共享数据结构,这个过程中不会出现意外的情况。有多种策略可用于创建线程安全数据结构。那么share_ptr在什么情况会出现线程不安全问题呢?
2023-09-24 20:31:52
390
1
原创 关于ET阻塞和非阻塞的一点小小理解
就好比一共90k数据,一次读20k,最后剩10k,这10k没有问题,阻塞和非阻塞模式下都能读取。在进行下一次的时候,阻塞套接字就会阻塞在那了,就没办法执行后边的操作了。非阻塞套接字就会返回个错误,然后该干嘛干嘛去了。在其他大佬看到的博客上写的是,ET模式下要使用while循环来不停的read数据,阻塞模式下read函数在最后一次会阻塞,笔者纠结的点在于,数据不都读完了吗,怎么还会阻塞呢?对于LT,他就read一次,你阻塞套接字read一次也把数据拿出来了,后边也不会进循环来read然后阻塞。
2023-09-24 18:26:24
83
1
原创 关于select、poll和epoll
常规的TCP-socket通信的流程一般如下;1.服务端创建监听套接字(socket),初始化网卡(SOCKADDR_IN),监听套接字绑定网卡(bind),调用(listen)函数开始监听;2.客户端创建套接字1(socket),根据服务端的IP地址还有端口初始化网卡(SOCKADDR_IN),调用(connect)函数与服务端连接。3.服务端accept函数,取出连接,获得一个套接字2,之后双方的通信在套接字1和套接字2之间进行。有个问题?
2023-09-24 16:18:15
70
1
原创 关于哈希函数冲突处理方法的优缺点
当我们的所需要存放值的位置被占了,我们就往后面一直加1并对m取模直到存在一个空余的地址供我们存放值,取模是为了保证找到的位置在0~m-1的有效空间之中。
2023-09-24 12:17:32
389
1
原创 pcap_findalldevs_ex函数简介
指定的是本地设配器或者远程适配器:本地适配器:'rpcap://' 列出所有可用的本地设备远程适配器:'rpcap://host:port' 列出远程host中的所有可用设备抓包文件。'file://c:/myfolder/'. 列出文件夹中的所有文件其定义如下:2.auth结构体定义如下:{int type;};type:简要身份验证所需的类型。username:用户名password:密码auth参数可以为NULL.
2022-09-13 22:06:35
1093
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人