自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【网易】C++设计模式笔记

【网易】C++设计模式笔记设计模式1-面向对象设计原则设计模式3-策略模式设计模式4-观察者模式设计模式5-装饰模式待续。。。

2020-08-20 00:06:28 123

原创 TCP/IP网络编程笔记目录

TCP/IP网络编程笔记目录Chapter I 开始网络编程Chapter II 基于Linux的编程Chapter I 开始网络编程1基于Linux的文件操作2理解网络编程与套接字3网络编程各基础函数的使用方法4实现一个简单TCP服务器端与客户端5基于半关闭的文件传输程序 & shutdown函数6套接字的多种可选项7进程与僵尸进程18进程与僵尸进程29基于多任务的并发服务器实现10进程间通信 &保存消息的回声服务器端Chapter II 基于Linux的编程

2020-05-19 23:41:41 291

原创 左神算法基础班C++实现目录

左神算法基础班C++实现class1class2class3class1题目1:遍历、二分、外排打印数组B不在A中的数及复杂度分析题目3、4、5:冒泡,选择、插入排序实现及复杂度分析题目7、8:归并排序实现、复杂度分析及其应用:小和问题、逆序对问题class2题目1:荷兰国旗问题及复杂度分析题目2:经典快排、荷兰国旗改进快排及随机快排题目3:堆heapInsert、heapify、...

2019-12-17 16:45:00 2664 1

原创 c++实现一个简易的网络缓冲区

简单的网络区设计与实现1).为什么需要设计网络缓冲区,内核中不是有读写缓冲区吗?2).缓冲区应该设置为堆内存还是栈内存?3).读写缓冲区的基本要求是什么?4).如何界定数据包?5).几种常见的缓冲区设计

2021-12-24 23:02:40 4147 2

原创 一种整型数值的压缩算法

int类型的表示范围从0~4294967295,共占用四个字节。而在实际处理中,某些较小的数在除了真正存储的数值以外,其他字节填充值为0,例如7的二进制表示如下,如何将未用上的前三个字节去掉以便节省空间呢?本压缩算法将每个字节的最高位作为标志位标识整型数值是否结束,未结束置1,结束置0。从低位向高位类推,每个字节都有一位不进行存储,那么四个字节共计有四位需要单独存储。也就是说,本压缩算法能够将4个字节的数值压缩为1~5个字节。

2021-12-15 09:25:13 4384

原创 c++11——initializer_list例子

std::initializer_list能够进行列表初始化,可以是自定义数据类型1.简单使用:接收任意长度的数据需求:封装一个A类能够接收任意长度的数据传入。A类实际是封装的vector数组,有三个成员函数:构造函数、增加函数和打印函数class A {public: A(initializer_list<int> integers); void add(initializer_list<int> integers); void print();private:

2021-12-14 09:19:54 393

原创 gdb调试——③调试正在运行的程序

gdb调试——③调试正在运行的程序1.总述2.调试正在运行的程序(1)打开两个终端(2)gdb调试1.总述为了模拟正在运行的程序,使用sleep函数每1秒触发一次。程序如下所示test1.cpp#include<iostream>#include <unistd.h> //sleepusing namespace std;void div(int a){ int step = 0; for (step = 0; step < 10000; step++)

2021-06-01 22:33:14 3560

原创 gdb调试——②调试core文件

gdb调试——②调试core文件1.总述2.调试core文件的过程(1)设置core file size(2)重新编译与运行(3)使用gdb调试1.总述程序运行时由于内存溢出,程序可能挂掉。那么通过gdb调试core文件可以定位内存溢出的位置有如下代码,在div函数中定义一个指针并返回其地址给main函数使用(返回局部变量的地址),在编译时不会出现错误,而运行时会出现段错误。//test.cpp#include<iostream>using namespace std;int* d

2021-05-31 21:54:48 4176 2

原创 大话设计模式9—观察者模式(通知者与观察者)

大话设计模式9—观察者模式(老板回来,我不知道)1.需求:老板回来,我不知道2.双向耦合的设计2.1 前台秘书类2.2 看股票同事类2.3main函数及输出3.解耦修改3.1 抽象观察者类3.2 前台秘书类2.3main函数4.观察者模式实现5.观察者模式61.需求:老板回来,我不知道假设同事1、同事2上班摸鱼炒股,为了防止老板发现,如果前台发觉老板回来迅速打电话告知两位同事。2.双向耦合的设计根据需求,可以设计两个类前台秘书类class Secretary和看股票同事类class StockObs

2020-12-29 22:43:16 585

原创 大话设计模式8—建造者模式(建造小人)

大话设计模式8—建造者模式(建造小人)1.需求:建造小人2.普通实现3.建造者模式实现4.建造者模式1.需求:建造小人假设需要使用画笔和图片画两个小人,小人只需要包含头部、身体和腿就可以。这两个小人一个是瘦人、一个是胖子。现给出画笔和图片两个类如下:class Pen {public: Pen();};class Graphics {public: Graphics();};构造函数Pen::Pen() { cout << "use yellow pen" <

2020-12-22 23:48:40 371

原创 大话设计模式7—外观模式(基金投资)

大话设计模式7—外观模式(基金投资)1.需求:基金投资2.普通实现3.外观模式实现4.外观模式1.需求:基金投资假设股民投资炒股票有两只股票、国债、房地产可以投资,请设计一个类,包含每一项的买入卖出功能。2.普通实现按照需求代码结构图如下,分别对股票、国债、房地产设计多个类,每个类有两个成员函数,买入和卖出。#ifndef INVESTMENT_H#define INVESTMENT_H#include<iostream>using namespace std;class

2020-12-15 23:48:02 221

原创 大话设计模式6—模板方法模式(考试抄题)

大话设计模式6—模板方法模式(考试抄题)1.需求:考试抄题2.普通实现3.模板方法模式实现4.模板方法模式1.需求:考试抄题假如某考试只有选择题,试卷题目相同,不同的题目每人选择不同,请设计试卷类,包括三道题目,并给出甲乙两人的答案。如下为输出,共两道题两个学生选择各不相同2.普通实现由于甲乙两个人选择题答案并不相同,可以设计两个试卷类。试卷类只有三个成员函数即试题1、试题2、试题3的题目及所选答案甲的试卷类如下:#ifndef TESTPAPERA_H#define TESTPAPER

2020-12-14 23:20:19 210

原创 大话设计模式5—原型模式(简历复印)

大话设计模式5—原型模式1.需求:简历复印2.普通实现(1)常规做法(2)憨批做法3.原型模式4.实现1.需求:简历复印设计一个简历类,要求包含姓名、性别、年龄,此外能够设计工作经历(公司名和工作时间),最终需要一个人三份不同的简历,如下图所示。2.普通实现(1)常规做法简历类包含的变量有姓名、性别、年龄、公司名、工作时间,构造函数负责初始化变量名字,此外还有三个成员函数分别进行设置个人信息、设置工作经历和打印简历。那么题设需求只需要实例化三次就行。Resume类#ifndef RESUME

2020-12-12 00:03:43 270

原创 大话设计模式4-代理模式

1.需求:设计代理设计代理替代追求者向被追求者送玩偶、送花、送巧克力。分析:追求者类和代理类都应该拥有送礼物的接口,只不过代理类送的礼物实际是追求者送的2.实现(1)被追求者类被追求者Schoolgirl类只有name这一成员变量,两个成员函数是设置name和获取name。class Schoolgirl {private: string name;public: string getName() { return name; } void setName(string str

2020-10-08 22:20:42 117

原创 大话设计模式2-策略模式(商场促销)

大话设计模式2-策略模式1.需求:商场促销2.简单工厂实现3.策略模式4.策略模式与简单工厂的结合5.反思1.需求:商场促销商场有不同的促销情况,可以打折、满减以及不促销2.简单工厂实现简单工厂实现可以①设计一个收费抽象类,交给子类去重写#pragma onceclass cashSuper {public : virtual double acceptCash(double money) { return money; }};②再定义正常收费、满减、打折三个子类。正常收费

2020-10-08 14:23:43 266

原创 大话设计模式1-简单工厂

大话设计模式1-简单工厂1.需求:设计一个计算器2.普通实现2.存在问题3.简单工厂1.需求:设计一个计算器需要支持加减乘除四种运算2.普通实现设计一个Operation类,根据输入的数字和运算符确定执行什么操作class Operation {public: double GetResult(double numA, double numB, char oper) { double res = 0.0; switch (oper) { case '+': res

2020-10-08 13:36:53 79

原创 设计模式6-工厂模式

设计模式6-工厂模式1.动机2.模式定义3.例子:文件分割器普通方法工厂模式4.工厂模式完整的代码5.要点总结1.动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?2.模式定义3.例子:文件分割器一个文件分割器,点击button进行split操作存在的问题:在动态变化的场景中观察,需要看出这个类型未来变化的需求,所以我们

2020-08-21 14:12:57 123

原创 设计模式5-装饰模式

设计模式3-策略模式1.动机2.模式定义3.例子-流操作1.动机在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?2.模式定义3.例子-流操作有不同的流需求、文件流、网络流。需要进行加密或者缓

2020-08-20 00:02:24 103

原创 设计模式4-观察者模式

设计模式4-观察者模式1.动机2.模式定义3.例子:文件分割器普通方法策略模式4.策略模式完整的代码5.要点总结1.动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。2.模式定义3.例子:文件分割器首先要做一个界面类,包括文件路径以及文件的分

2020-08-19 01:01:16 99

原创 设计模式3-策略模式

设计模式3-策略模式1.动机2.模式定义3.例子:缴税计算普通方法策略模式4.策略模式完整的代码5.要点总结1.动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?2.模式定义定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子

2020-08-18 22:25:32 124

原创 设计模式1-面向对象设计原则

设计模式1-面向对象设计原则重新认识面向对象设计原则1.依赖倒置原则(DIP)2.开放封闭原则(OCP)3.单一职责原则(SRP)4.Liskov 替换原则(LSP)5.接口隔离原则(ISP)6.优先使用对象组合,而不是类继承7. 封装变化点8.针对接口编程,而不是针对实现编程重新认识面向对象底层的面向对象:封装、继承、多态。重新认识抽象的面向对象:1.理解隔离变化• 从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小2.各司其职• 从微观层面来看,面向对象的方

2020-08-18 21:29:02 83

原创 c++面试高频2-设计一个单例模式

c++面试高频2-设计一个单例模式设计一个单例模式懒汉饿汉设计一个单例模式懒汉/*单例模式首先需要一个私有的、静态的单例对象(或者指针);接着需将构造函数声明为私有;最后开放一个公有接口用于获取这个单例对象(由于外部无法获得本类的一个对象,也就无法调用非静态方法,因此需将本接口声明为静态)。*/#include <mutex>#include<iostream>#include<thread>#include<Windows.h>usi

2020-08-03 20:56:22 135

原创 c++面试高频3——设计一个洗牌算法

c++面试高频3——设计一个洗牌算法给定N张扑克牌和一个随机函数,设计一个洗牌算法我们有一个随机函数发生器,能够产生1-54之间的随机数,如何保证抽第一张牌是54中可能,抽第二张牌是53中可能……需要实每次取完元素后,我们就不会让这个元素参与下一次的选取。 那么第一次抽牌在初始54张牌中,将随机产生的牌x,与第一个元素互换,第二次抽牌在剩下的53张牌中,将随机产生的牌y,与第二个元素互换,注意互换后的牌不参与随机选取。for(int i = 0;i < n;i++){ int index =

2020-07-30 16:43:00 416

原创 面试高频——实现一个Memcpy函数

c++面试高频2——实现一个Memcpy函数库函数 - memcpy()memcpy()使用示例实现memcpy() 函数完整代码库函数 - memcpy()void *memcpy(void *dst, const void *src, size_t n) 从存储区 src复制 n 个字节到存储区 dst。注意类型强转为void*src不可更改加const返回值为void*memcpy()使用示例#include <stdio.h>#include <string.h

2020-07-30 16:07:36 325

原创 TCP/IP网络编程笔记Chapter II -1套接字和标准IO

TCP/IP网络编程笔记Chapter II -1套接字和标准IO1.标准I/O函数优点及缺点(1)标准I/O函数的优点(2)标准I/O函数的缺点2.使用标准I/O函数(1)利用fdopen函数转换为FILE结构体指针(2)利用fileno函数转换为文件描述符3.基于套接字的标准I/O函数使用之前我们使用的都是默认数据通信手段read&write函数及系统I/O函数,未使用过标准I/O函数。1.标准I/O函数优点及缺点(1)标准I/O函数的优点标准I/O函数具有良好的移植性标准I/O函数

2020-05-24 22:46:23 197

原创 TCP/IP网络编程笔记Chapter I -12多种I/O函数

TCP/IP网络编程笔记Chapter I -12多种I/O函数1.send & recv函数(1)Linux中的send & recv(2)MSG_OOB:发送紧急消息(3)MSG_PEEK & MSG_DONTWAIT2.readv & writev函数(1)readv函数(2)writev函数(3)总结1.send & recv函数(1)Linux中的send & recvLinux中的send & recv和Windows平台的send

2020-05-20 23:07:12 178

原创 TCP/IP网络编程笔记Chapter I -11 I/O复用 & 实现I/O复用服务器端

TCP/IP网络编程笔记Chapter I -1I/O复用 & 实现I/O复用服务器端1.I/O复用技术2.select函数(1)select函数的功能及调用顺序(2)设置文件描述符(3)设置监视范围及超时(4)调用select函数后查看结果3.实现I/O复用服务器端我们接下来延伸并发服务器的实现。首先我们需要知道多进程服务器端的缺点,那就是创建进程时需要付出很大的代价,需要大量的运算和内存空间,由于每个进程都具有独立的内存空间,所以相互间的数据交换也需要使用管道这样相对复杂的方法。那么能否不创

2020-05-20 16:24:44 234

原创 TCP/IP网络编程笔记Chapter I -10进程间通信 &保存消息的回声服务器端

TCP/IP网络编程笔记Chapter I -10进程间通信 &保存消息的回声服务器端1.管道实现进程的通信(1)单向通信(2)双向通信2.保存消息的回声服务器端实现1.管道实现进程的通信进程间通讯意味着两个不同的进程间可以交换数据,本节实现通过管道实现进程的通信。(1)单向通信基于管道的进程间通信结构模型如下,可以看出管道和套接字一样,并不属于进程的资源而是属于操作系统,所以不是fork函数复制的对象。两个进程通过操作系统提供的内存空间进行通信。下面介绍创建管道的函数。#includ

2020-05-19 23:34:49 204

原创 TCP/IP网络编程笔记Chapter I -9基于多任务的并发服务器实现

TCP/IP网络编程笔记Chapter I -9基于多任务的并发服务器实现1.基于进程的并发服务器模型2.实现并发服务器(1)服务器端(2)客户端(3)运行3.分割TCP的I/O模型在上节我们了解了子进程的创建以及僵尸进程的处理方法,现有知识已经足够我们编写一个多任务的并发服务器了,这节我们就来实现它。1.基于进程的并发服务器模型之前的回声服务器端每次只能向一个客户端提供服务,因此,我们将拓展回声服务器端,使其可以向多个客户端提供服务。下图给出了回声服务器端的实现模型。可以看出每当有客户端请求服务

2020-05-19 19:28:54 237

原创 TCP/IP网络编程笔记Chapter I -8进程与僵尸进程2

TCP/IP网络编程笔记Chapter I -8进程与僵尸进程21.信号与signal()函数2.信号与sigaction()函数3.利用信号处理技术消灭僵尸进程在上一篇中,我们知道了进程的创建以及销毁方法,但是还有一个问题困扰着我们:子进程究竟什么时候终止,调用waitpid()函数后需要无休止的等待吗?子进程终止时识别的主体是操作系统,能不能让操作系统告诉父进程子进程终止了,让父进程暂时先处理子进程再继续工作呢?当然是可以的,我们引入信号处理机制。此时的信号是在特定事件发生时由操作系统向进程发送的消

2020-05-19 16:04:52 153

原创 TCP/IP网络编程笔记Chapter I -7进程与僵尸进程1

TCP/IP网络编程笔记Chapter I -7进程与僵尸进程11.并发服务器的实现方法2.进程的概念(1)理解进程(2)使用fork()函数创建进程3.僵尸进程(1)产生原因(2)使用wait()函数销毁僵尸进程(3)使用waitpid()函数销毁僵尸进程1.并发服务器的实现方法我们之前实现了一个服务器端可以依次和多个客户端进行通信,但是如果能同时向多个客户端提供服务会提高CPU的利用率,下面列出代表性的并发服务器端实现模型与方法。多进程服务器 :通过创建多个进程提供服务多路复用服务器:通过捆绑

2020-05-19 12:29:18 191

原创 TCP/IP网络编程笔记Chapter I -6套接字的多种可选项

TCP/IP网络编程笔记Chapter I -6套接字的多种可选项1.套接字可选项进而I/O缓冲大小(1)getsockopt和setsockopt(2)SO_SNDBUF和SO_RCVBUF2.SO_REUSEADDR3.TCP_NODELAY1.套接字可选项进而I/O缓冲大小之前我们写的程序在创建好套接字后都直接使用,但有些时候需要更改,所以本节我们学习下部分套接字的可选项。其中名称含义IPPROTO_IPIP协议相关IPPROTO_TCPTCP协议相关SOL

2020-05-18 23:07:37 154

原创 TCP/IP网络编程笔记Chapter I -5基于半关闭的文件传输程序 & shutdown函数

TCP/IP网络编程笔记Chapter I -5基于半关闭的文件传输程序 & shutdown函数1.TCP套接字中的IO缓冲2.基于TCP的半关闭(1)单方面断开连接带来的问题(2)shutdown()函数(3)为何必须半关闭3.基于半关闭的文件传输程序(1)服务器端(2)客户端(3)运行如前所述,TCP套接字的数据收发无边界,在上一节实现一个简单TCP服务器端与客户端的最后,在客户端我们调用了一次write()函数写入,但多次调用了read()函数。这让我们产生了疑问,假设每次传输40字节,而

2020-05-18 19:08:18 285

原创 TCP/IP网络编程笔记Chapter I -4实现一个简单TCP服务器端与客户端

TCP/IP网络编程笔记Chapter I -4实现一个简单TCP服务器端与客户端1.回顾服务器端与客户端函数的调用关系2.实现hello_word服务器端与客户端(1)服务器端(2)修改的服务器端(3)客户端(4)修改的客户端(5)运行3.实现迭代服务器端与客户端在前3篇文章中,我们大致了解了网络编程与套接字、服务端与客户端各函数的使用方法,本篇将在此基础上完成一个简单的hello_word通信,并修改为迭代服务端与客户端1.回顾服务器端与客户端函数的调用关系下图说明了TCP服务端与客户端的实现顺序

2020-05-17 00:00:17 400 1

原创 TCP/IP网络编程笔记Chapter I -3网络编程各基础函数的使用方法

TCP/IP网络编程笔记Chapter I -3网络编程各基础函数的使用方法1.套接字类型与协议设置-socket函数2.地址族与数据序列-bind函数(1)IP地址与端口号(2)地址信息的表示(3)网络字节序与地址转换(4)网络地址的初始化与分配(5)bind函数3.进入等待连接请求状态-listen函数4.受理客户端请求-accept函数5.请求连接-connect函数在上一篇我们已经大概理解网络编程与套接字是做什么用的,本篇我们需要学会使用网络编程各基础函数的使用方法1.套接字类型与协议设置-so

2020-05-16 21:59:01 326

原创 TCP/IP网络编程笔记Chapter I -2理解网络编程与套接字

TCP/IP网络编程笔记Chapter I -2理解网络编程与套接字1.网络编程与套接字2.流程(1)服务端--接电话套接字socket函数bind函数listen函数accept函数整理(2)客户端--打电话套接字connect函数2.服务端与客户端的调用顺序1.网络编程与套接字网络编程就是编写程序使两台联网的计算机相互交换数据,套接字是网络数据传输用的软件设备,是用来连接该网络的工具。2.流程套接字大致分为两种,我们把TCP套接字比做电话机,电话机可以同时拨打和接听,我们先讨论接听的套接字创建部

2020-05-16 15:41:31 200

原创 TCP/IP网络编程笔记Chapter I -1基于Linux的文件操作

TCP/IP网络编程笔记Chapter I -1基于Linux的文件操作1.总述(1)打开文件(2)关闭文件(3)写入文件2.应用(1)创建文件并保存数据(2)通过read函数读取data.txt中保存的数据1.总述Linux下一切都是文件 ,对于文件的操作,我们需要用文件操作符来指定。文件一般经过创建过程才会分配文件描述符,可以把它理解为方便称呼操作系统创建的文件而赋予的数。文件描述符fd对象0标准输入1标准输出2标准错误(1)打开文件需要的头文件:#i

2020-05-16 14:53:25 209

原创 手写string类

手写string类1.题目:实现string类2.分析(1)设计类(2)构造函数(2)拷贝构造函数(3)拷贝赋值函数(4)析构函数(5)operator+(6)operator+=(7)operator==(8)operator[ ](9)operator<<3.完整代码1.题目:实现string类包含构造函数、拷贝构造函数、析构函数、拷贝赋值扩展:重载+、重载+=、重载==、重...

2020-04-17 22:02:05 2144 2

原创 左神算法进阶class2—单调栈应用2:求最大子矩阵

左神算法进阶class2—单调栈应用2:求最大子矩阵1.题目:单调栈应用2:求最大子矩阵2.分析3.核心代码4.完整代码1.题目:单调栈应用2:求最大子矩阵给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。例如:1 1 1 0其中,最大的矩形区域有3个1,所以返回3。再如:1 0 1 11 1 1 11 1 1 0其中,最大的...

2020-04-16 23:22:04 234

原创 左神算法进阶class2—单调栈应用:直方图中矩形的最大面积

左神算法进阶class2—单调栈应用:直方图中矩形的最大面积1.题目:直方图中矩形的最大面积2.分析3.核心代码4.完整代码1.题目:直方图中矩形的最大面积给定数组{ 6,5,2,3,4 }代表直方图的高度,求矩形的最大面积,如下图所示最大面积为红色或蓝色的102.分析本题可以把直方图的高视为一个杆子,杆子划过的距离的最大值为最大面积。如下图1长度为4的杆子只能在当前区域,右侧的高度为3...

2020-04-16 21:41:53 567 1

空空如也

空空如也

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

TA关注的人

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