自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 模板与继承

但在大多情况下,模板类都有默认的参数,但是如果我想修改其中的一个参数,例如我要修改T3的默认参数那么我就得知道T1,T2,因为输入缺省参数得知道前面所有参数得值。这样的传参实际上就是就是传入类第一个参数,其他三个参数用的都是默认值,之后PolicySelector分别继承Discriminator 1,2,3,4, 由于。在Opt的大小为8, 应该是存在内存对其的问题。都是派生类,它们里面都拥有P1, P2,P3,P4,这样最后在继承Discriminator的时候将新传入的参数覆盖掉了之前的参数。

2023-06-09 01:27:59 323

原创 策略模式代码练习~

在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。他们分别封装了文件和网络的write和read, 之后我们需要对这些文件加密,还要对这个stream进行缓存,甚至更多的操作。的指针,这样子每一层stram只需要关系自己的内容。这里可以联想到ogre。可以向上提,但是能不放在base 的sream 显然不适合,因为。都继承Stream是为了统一接口。

2023-03-26 23:47:23 159

原创 随便写写,用于记录,工厂方法

工厂方法的小总结

2022-10-24 00:12:36 613

原创 std::bind

std::bind 用法

2022-10-08 00:01:59 308 1

原创 lsof的使用

lsof

2022-07-24 22:58:19 462

原创 vscode对C++程序进行调试

linux中vscode调试

2022-02-05 14:41:48 3973

原创 C++智能指针的使用 shared_ptr weak_ptr unique_ptr

shared_ptrC++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已

2022-01-03 01:17:38 754

原创 tcp使用epoll进行实现并发

tcp使用epoll进行实现并发tcp 服务器编写的步骤都是很熟悉的了。tcp由于每一个新的连接都会新建一个socket和客户端进行通信,但是新建立的连接在很多次之后就会管理就会出现问题,这个时候就可以使用epoll进行管理。epoll是一种多路转接io,相比selete和poll在管理大量描述符的时候优势很明显。具体的优势我们后面可以慢慢说。epoll的流程, 创建epoll描述符–> 添加事件–> wait; int epoll_create (int __size) __size

2021-12-13 01:56:04 4865

原创 Linux定时任务

想让linux程序到一个时间点自动运行,比如说隔一段时间我想运行一个程序检测一下女朋友相册有没有新照片如果有发给我。 反正就是类似的功能,就可以使用at和cron。linux定时任务linux上定时任务分为两种一种是周期性执行的,一种是定时只执行一次的任务。atat用于只执行一次的任务,这个依赖于一个服务 atd并非所有的linux发型版这个服务都是自启动的,在设置启动任务之前可以先检查一下后台服务是否启动。systemctl status atd 查看服务状态systemctl enable

2021-11-22 18:14:46 5007

原创 字典树,前缀树,某方面比哈希表还厉害的玩意

前缀树Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有

2021-10-31 20:29:30 494

原创 inotif机制,监控文件系统变化

INOTIFY 机制inotif可以对文件系统进行监控,监控文件系统中发生的事情。为了截取文件系统的变化,inotif机制在文件系统的各个操作中加入了hook函数,当文件系统调用了这些操作函数并改变了文件系统中的文件或目录的时候,就会调用hook函数发出对应的时事件。并将这个事件放到内核的一个队列中,应用层可以取走这些事件,同时如果事件过多而没用及时取走事件的话就有可能丢失事件。​ 说人话就是这东西可以监控文件或目录被读了,被写了,创建了,删除了,被移动了,被访问了等等。这个在linux内核 二点几之

2021-10-31 19:01:18 512

原创 makefile的使用

直接开始说怎么使用吧makefile虽然现在直接写比较少,而且笔直一年开发了接触也比较少但是吗不管是什么cmake也好还是qmake也好最后也都是转换成了makerfile了。自己平时写dome的时候如果有多个文件一个一个的编译也确实不方便。makefile 的三要素...

2021-09-05 14:54:12 245

原创 随机数生成生成器和力扣按权重随机选择 528

随机数生成生成器和力扣按权重随机选择 528std::random_device{}() // 生成真随机数,在linux中这个是通过读取 /dev/urandom 进行获取的, 一般用于做随机数种子mt19937 // 用于生成伪随机数, 这个和rand()类似都是需要设置随机数种子。真随机数一般为操作系统生成,根据当前操作系统的中断,键盘鼠标的输入,文件句柄等等一系列随机事件组成。伪随机数一般由算法组成,mt19937实际上就是一个算法的名称。#include <iostream&g

2021-09-01 17:38:37 487

原创 一个字符串求其最长的子回文串

一个字符串求其最长的子回文串爆破分割子字符串,从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){

2021-04-24 16:23:25 280 1

原创 责任链模式

责任链模式定义使多个对象都有机会处理请求,从而避免请求的发送着和接受着之间的耦合关系,将这些对象连成一条链,并沿着这条链传递请求,知道有一个对象处理它为止例请假流程,1天内需要主程序批准,3天内需要项目经理批准,3天以上需要老板批准,意思就是说根据条件如何合适就执行逻辑,不符合那么就继续寻找下一个节点直接上代码:#include <iostream>using namespace std;class Context {public: std::string nam

2021-03-30 15:21:38 128

原创 策略模式和状态模式

策略模式定义定义一一系列算法,把他们一个个封装起来,并且使他们可互相替换,该模式使得算法可独立使用于它的客户程序而变化例超市做一个促销活动,每个节日的活动,活动的类型很多,春节五一十一等等一系列活动。而每个节日的活动都不一样,比较糟糕的写法如下:#include <iostream>using namespace std;enum VacationEnum { VAC_Spring, VAC_QiXi, VAC_Wuyi, VAC_GuoQing, //

2021-03-30 10:52:59 122

原创 观察者模式

定义定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并自动更新例子气象站采集数据,气象中心通过气象站的获取气象站的数据然后都通过处理后得当前得气温,之后再显示到不同的终端根据上述的例子可以写出下面的代码:#include <iostream>using namespace std;//比较搓的写法class DisplayA {public: void Show(float temperature){

2021-03-29 16:24:32 120

原创 模板设计模式

模板方法定义定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤就是说一个算法中间又可以分为很逗步骤,但是流程是固定的就可以使用该模式。由于算法的流程是一个不变的那么就应该把其抽象出来,用子类去实现过程的实现例如:某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程受欢迎程度比较低,希望将这几个表演流程创新,以尝试迭代更新表演流程;直接上代码,下面这个是普通的写法,#include <iostream>us

2021-03-29 11:07:48 114

原创 单例模式

单例模式单例模式在日常开发的时候用的还是比较多的,写法呢也不较多,但是了很多时候可能写的不够完善,比如内存没有进行正确释放,没有进行加锁操作。前者可能出现段错误和内存泄漏,后者可能出现多线程竞争的问题。不多BB直接上代码class singleton {public: static singleton* GetInstance() { if (_instance == nullptr) { _instance = new singleton(); } return _in

2021-03-09 00:06:21 167

原创 Linux中在代码中获取用户名和当前登录的用户名

网上获取用户名字的方法很多,但是有些一使用sudo命令,获取到的用户名就是root的用户名了。直接上代码#include <stdio.h>#include <pwd.h>#include <unistd.h>#include <stdlib.h>int main(){ struct passwd *pwd; pwd = getpwuid(getuid()); char * en = getenv("USER"); char *

2021-03-07 12:58:09 2238

原创 进程和线程的概念以及实现原理

进程的概念进程就是一个运行起来的程序,存在的目的在于,可以让一个计算机运行多个程序,cup通过切换运行的进程来达到伪并行的目的。有了进程的概念就算CPU只有一个,操作系统也可以让程序达到并行的目的。如上图所示:一个操作系统只有一个CPU,但是有四个进程(A,B,C,D),操作系统通过将多个进程交替放在CPU上执行,每个进程分到一段时间进行执行,就可以让用户感觉到程序是并行执行的。说白了在操作系统层次,进程就是运行起来程序的一个抽象。进程的创建导致进程创建有以下几种情况:1) 系统初始化,例如在系

2020-08-24 13:35:39 1325

原创 计算机内存使用方式

早期计算机内存使用方式早期的计算机内存使用根本就没有所谓的抽象(考虑如何使用),比如下面这条汇编指令: MOVE REGISTER1,1000这条汇编代码的作用为,将地址为1000的物理内存上的内容移到REHISTER1中,那是的物理内存给人的映像就为0到一个上限的集合,每个地址上能存一定数目的二进制数,一般都为八位。以冯诺依曼的计算机设计思路为,CUP现在内存中取指(这里的指,代表指令类型,比如接下来是要做加法还是减法,左移还是右移,构架不同的CUP所用的指令集是不同的,所以就有了X86,X64

2020-08-23 23:42:52 600

原创 Linux命令详细总结(一)

who, who am i , w, users, tty命令who这个命令可以查看当前系统上有哪些连接。who am i这个命令和上述一样但是只能显示自己单独的信息。whoami这个命令功能十分简单,用于看当前登录用户的用户名w这个命令和who命令类似但是会显示出更加详细的信息。如下图如图所示,现实的9点54分为当前系统的时间,up 19min 表示当前系统已经启动了19min, 目前有两个用户在使用(本环境是用VM开启的linux虚拟机,在Win上使用Xshell进行的连接,开启

2020-06-26 11:40:41 189

原创 关于auto_ptr/unique_ptr/shared_ptr

问题引出因为C++ 中没有垃圾回收机制, 在用new完对象后很容易忘记delete这个对象,从而造成内存泄漏。而利用在函数栈退出时栈上的对象会被释放这个特征, 由此可以联想到用一个其他的对象将new出的资源进行管理, 只要函数栈跳出, 那么这个对象的析构函数顺带将其管理的内存释放掉, 从而组织内存泄漏RAll 思想template<class T> class SmartPtr...

2020-02-19 23:23:55 150

原创 C中的malloc/calloc/realloc和free

1.1 mallocvoid* malloc (size_t size); 1)如果开辟成功,则返回一个指向开辟好空间的指针。2)如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。3)返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。4)如果参数 size 为0,malloc的行为是标准是未定义的,取决...

2020-02-18 18:51:40 208

原创 线程池

线程池一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线 程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够 保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络 sockets等的数量线程池的应用场景: *1.需要大量的线程来完成任务,且完成任务的...

2020-02-02 03:01:37 189

原创 信号量(实现线程的同步与互斥)

信号量:功能: 实现线程间的同步与互斥本质:一个计数器(做资源计数-判断当前是否能对临界资源进行操作)+等待+唤醒 +等待队列原理:互斥原理:只具有0或1计数时,就可以实现互斥初始计数为1,1表示当前只有一个线程能获取资源;其实现:posix...

2020-02-01 14:46:23 1086

原创 条件变量(实现同步)

条件变量:用于实现线程间同步条件变量通过提供线程等待,直到被唤醒的进程唤醒,从而实现线程同步;条件变量本身不具备条件判断功能;也就是意味着什么时候该等待,什么时候该唤醒等待的线程,都需要用户来控制;实现流程:pthread_cond_wait:(解锁+休眠) +被唤醒后加锁...

2020-01-31 16:13:38 1107

原创 Linux线程互斥(线程安全)

线程安全可以看一下的实例:#include <iostream>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>using namespace std;int ticket = 100; //thread_mutex...

2020-01-30 19:59:22 230

原创 线程创建以及线程控制

线程底层:在linux下PCB模拟实现进程,通俗的说就是一个大的PCB下有很多小的PCB,称为轻量级进程。在一个进程中有多个PCB,而这些所有的PCB共用同一份虚拟地址空间。而这些PCB共同基层构成一个PCB组,一个线程组就为一个进程。3.一个线程是程序执行的基本单位,进程是资源调度的基本单位。线程是CPU调用的基本单位。线程之间的资源共享 :独有:函数调用栈寄存器 (不是硬件...

2020-01-29 22:56:14 227

原创 二叉搜索树的建立

二叉搜索树的概念二叉搜索树又称二叉排序树, 最基本形态就是一颗空树,它具有以下一个性质:· 如果一个节点有左子树, 那么左子树上的节点值都小于该节点· 如果一个节点有右子树, 那么右子树上的节点值都大于该节点最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:log2N最差情况下,二叉搜索树退化为单支树,其平均比较次数为:N#pragma once#include<iostr...

2020-01-16 15:50:21 340

原创 UDP实现通信

UDP协议:无连接 不可靠传输 面向数据报传输本文目的是在linux下能实现简单的UDP通信搭建流程服务端:创建套接字绑定地址信息接收消息回复消息完成这些动作主要依靠系统提供的API来完成创建套接字:int socket(int domain, int type, int protocol);domain:是用什么版本的协议 例如 IPV4 or IPV6type : 创...

2019-11-09 20:50:11 327

原创 linux下GDB调试

对于一个.C程序说 ,编码完成后 ,要经过 预处理 编译 汇编 链接等过程最后生成可以执行的二进制文件.// 下面的filename代表 文件名称首先先复习一下整个过程a. 预处理 宏展开,去注释,将源代码展开 gcc -E [filename.c] -o [filename].ib. 编译 语法语义检测, 生成汇编代码 gcc -S [filename.i] -...

2019-11-01 15:14:57 223

原创 不修改数组找出重复的数字,以及有序数组的合并

题目:在一个长度为n+1的数组里所有的数字都在1~n之间,所以数组肯定至少有一个数字是重复的,请找出任意一个重复的数字,但不能修改数组例如:输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复数字2或者3;思路:一个容量为n+1的数组,中放值n个值,那么肯定至少有一个是重复的。数组不能修改,找出任意一个重复的。1.申请辅助空间,在修改。那么空间复杂度肯定上升2.通过二分...

2019-10-09 13:13:46 198

原创 关于数组的+1,指针的+1 ,-1等

指针功能很强大,有时候也有很多有意思的操作直接上代码吧 这段代码 看着还是很复杂的void test(){ int arr[5] = { 9,8,7,6,2 }; int *ptr = (int *)(&arr + 1); cout << *(int*)(&arr) << endl; cout << *(&arr) <...

2019-09-24 00:12:07 481

原创 vector的用法

vector 底层实现的方式为一个顺序表 容量按照vs每次1.5倍的增张,gcc为2倍实现不同那么增长方式就不同vector的构造方式 vector<int> ar1{ 1,2,3,4,5,6,7,8,9 }; vector<int> ar2(ar1.begin(), ar1.end()); vector<int> ar3(10, 1); vector...

2019-09-22 19:09:21 309

原创 剑指offer数组中的查重

1.在一个长度为n的数组中,所有数组都在0到n-1,然而有些数子是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次,请找出任意一个重复的数字,例如:如果输入长度为7的数组{2,3,1,0,2,5,3} 那么重复的数字就是2或者3;**思路一:**排个序,那么相同的元素肯定在一起。之后前后比较就可以了。void Qsort(vector<int>& arr, in...

2019-09-17 15:18:29 190

原创 数据结构堆的创建

堆定义: 一颗完全二叉树,堆中的元素存储到一维数组中,对于任意节点,如果该节点小于其左右孩子,称之为小堆,如果任意一节点值大于其孩子,则称为大堆。(上面最大就是大堆,上面最小就是小堆)堆的特征:1.堆的顶端一定为最大的,或者最小的2.如果根节点满足堆,那么他的左子树和右字数也满足堆得性质。(小堆如果不满足,则该节点可以和孩子节点较小的相替换)3.堆创建的时间复杂度,因为叶子节点比度为2的节...

2019-09-11 09:01:25 682

原创 二叉树的一系类基本操作

二叉树的创建根据定义二叉树有左右两个节点,本文是用孩子双亲表示法创建的二叉树:完成树的定义,给出构造函数方便节点的创建struct BTNode { BTNode(int data) :_pleft(nullptr) ,_pRight(nullptr) ,_data(data) {} BTNode* _pleft; BTNode* _pRight; int _data;...

2019-09-07 11:36:54 150

原创 MYSQL基础操作

1.进入数据库:mysql -uroot;2.创建数据库: create database student(数据库名);//同时也可以设置数据库的编码类型,和校验规则。也可使用以下语句,用于设置数据库是否区分大小写create database student collate utf8_bin; 查询区分大小写 ;create database student collate ut...

2019-09-02 12:18:03 237

空空如也

空空如也

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

TA关注的人

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