模板与继承 但在大多情况下,模板类都有默认的参数,但是如果我想修改其中的一个参数,例如我要修改T3的默认参数那么我就得知道T1,T2,因为输入缺省参数得知道前面所有参数得值。这样的传参实际上就是就是传入类第一个参数,其他三个参数用的都是默认值,之后PolicySelector分别继承Discriminator 1,2,3,4, 由于。在Opt的大小为8, 应该是存在内存对其的问题。都是派生类,它们里面都拥有P1, P2,P3,P4,这样最后在继承Discriminator的时候将新传入的参数覆盖掉了之前的参数。
策略模式代码练习~ 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。他们分别封装了文件和网络的write和read, 之后我们需要对这些文件加密,还要对这个stream进行缓存,甚至更多的操作。的指针,这样子每一层stram只需要关系自己的内容。这里可以联想到ogre。可以向上提,但是能不放在base 的sream 显然不适合,因为。都继承Stream是为了统一接口。
C++智能指针的使用 shared_ptr weak_ptr unique_ptr shared_ptrC++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已
tcp使用epoll进行实现并发 tcp使用epoll进行实现并发tcp 服务器编写的步骤都是很熟悉的了。tcp由于每一个新的连接都会新建一个socket和客户端进行通信,但是新建立的连接在很多次之后就会管理就会出现问题,这个时候就可以使用epoll进行管理。epoll是一种多路转接io,相比selete和poll在管理大量描述符的时候优势很明显。具体的优势我们后面可以慢慢说。epoll的流程, 创建epoll描述符–> 添加事件–> wait; int epoll_create (int __size) __size
Linux定时任务 想让linux程序到一个时间点自动运行,比如说隔一段时间我想运行一个程序检测一下女朋友相册有没有新照片如果有发给我。 反正就是类似的功能,就可以使用at和cron。linux定时任务linux上定时任务分为两种一种是周期性执行的,一种是定时只执行一次的任务。atat用于只执行一次的任务,这个依赖于一个服务 atd并非所有的linux发型版这个服务都是自启动的,在设置启动任务之前可以先检查一下后台服务是否启动。systemctl status atd 查看服务状态systemctl enable
字典树,前缀树,某方面比哈希表还厉害的玩意 前缀树Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有
inotif机制,监控文件系统变化 INOTIFY 机制inotif可以对文件系统进行监控,监控文件系统中发生的事情。为了截取文件系统的变化,inotif机制在文件系统的各个操作中加入了hook函数,当文件系统调用了这些操作函数并改变了文件系统中的文件或目录的时候,就会调用hook函数发出对应的时事件。并将这个事件放到内核的一个队列中,应用层可以取走这些事件,同时如果事件过多而没用及时取走事件的话就有可能丢失事件。 说人话就是这东西可以监控文件或目录被读了,被写了,创建了,删除了,被移动了,被访问了等等。这个在linux内核 二点几之
makefile的使用 直接开始说怎么使用吧makefile虽然现在直接写比较少,而且笔直一年开发了接触也比较少但是吗不管是什么cmake也好还是qmake也好最后也都是转换成了makerfile了。自己平时写dome的时候如果有多个文件一个一个的编译也确实不方便。makefile 的三要素...
随机数生成生成器和力扣按权重随机选择 528 随机数生成生成器和力扣按权重随机选择 528std::random_device{}() // 生成真随机数,在linux中这个是通过读取 /dev/urandom 进行获取的, 一般用于做随机数种子mt19937 // 用于生成伪随机数, 这个和rand()类似都是需要设置随机数种子。真随机数一般为操作系统生成,根据当前操作系统的中断,键盘鼠标的输入,文件句柄等等一系列随机事件组成。伪随机数一般由算法组成,mt19937实际上就是一个算法的名称。#include <iostream&g
一个字符串求其最长的子回文串 一个字符串求其最长的子回文串爆破分割子字符串,从1到2,1到3,1到4一直到完成。之后从2到3,3到4一直到完成。检测每一个字符串是否合法。其中if(int j = i - j + 1) 是一个剪枝操作,从而提升部分效率,为什么要加1呢,因为算的是这个串的长度。class Solution {public: bool isPalinDrome(string& s, int letf, int right){ while(letf < right){
责任链模式 责任链模式定义使多个对象都有机会处理请求,从而避免请求的发送着和接受着之间的耦合关系,将这些对象连成一条链,并沿着这条链传递请求,知道有一个对象处理它为止例请假流程,1天内需要主程序批准,3天内需要项目经理批准,3天以上需要老板批准,意思就是说根据条件如何合适就执行逻辑,不符合那么就继续寻找下一个节点直接上代码:#include <iostream>using namespace std;class Context {public: std::string nam
策略模式和状态模式 策略模式定义定义一一系列算法,把他们一个个封装起来,并且使他们可互相替换,该模式使得算法可独立使用于它的客户程序而变化例超市做一个促销活动,每个节日的活动,活动的类型很多,春节五一十一等等一系列活动。而每个节日的活动都不一样,比较糟糕的写法如下:#include <iostream>using namespace std;enum VacationEnum { VAC_Spring, VAC_QiXi, VAC_Wuyi, VAC_GuoQing, //
观察者模式 定义定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并自动更新例子气象站采集数据,气象中心通过气象站的获取气象站的数据然后都通过处理后得当前得气温,之后再显示到不同的终端根据上述的例子可以写出下面的代码:#include <iostream>using namespace std;//比较搓的写法class DisplayA {public: void Show(float temperature){
模板设计模式 模板方法定义定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤就是说一个算法中间又可以分为很逗步骤,但是流程是固定的就可以使用该模式。由于算法的流程是一个不变的那么就应该把其抽象出来,用子类去实现过程的实现例如:某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程受欢迎程度比较低,希望将这几个表演流程创新,以尝试迭代更新表演流程;直接上代码,下面这个是普通的写法,#include <iostream>us
单例模式 单例模式单例模式在日常开发的时候用的还是比较多的,写法呢也不较多,但是了很多时候可能写的不够完善,比如内存没有进行正确释放,没有进行加锁操作。前者可能出现段错误和内存泄漏,后者可能出现多线程竞争的问题。不多BB直接上代码class singleton {public: static singleton* GetInstance() { if (_instance == nullptr) { _instance = new singleton(); } return _in