- 博客(164)
- 资源 (2)
- 收藏
- 关注
原创 二叉树系列
涉及到二叉树的题,大部分是利用递归求解,因为二叉树这种结构看不见、摸不着,只能交给程序一层一层跑,而且主要是因为结构相同。递归求解,最主要的就是要考虑好终止的条件。目录剑指Offer(7)--重建二叉树剑指Offer(8)--二叉树的下一个节点剑指Offer(26)--树的子结构剑指Offer(27)--二叉树的镜像剑指Offer(28)--对称的二叉树剑指Off...
2018-11-02 12:48:40
511
原创 数组系列
目录剑指Offer(3)--数组中重复的数字剑指Offer(4)--二维数组中的查找剑指Offer(16)--数值的整数次方剑指Offer(21)--调整数组顺序使奇数位于偶数前面剑指Offer(29)--顺时针打印矩阵剑指Offer(39)--数组中出现次数超过一半的数字剑指Offer(40)--最小的k个数剑指Offer(42)--连续子数组的最大和剑...
2018-11-01 19:33:10
733
原创 SGI STL Sort算法
Sortstl所提供的各式各样的算法中,sort()是最复杂庞大的一个。这个算法接受两个随机存取迭代器,然后将区间内的所有元素以渐增方式由小到大重新排列。还有个版本则允许用户指定一个仿函数,作为排序标准。stl中的所有关系型容器都拥有自动排序功能,所以不需要sort算法。序列式容器中的stack,deque和priority_queue都有特别的入口,不允许用户对元素排序。剩下的vecto...
2018-10-30 21:28:16
281
原创 list总结
list的节点list本身和list的节点是不同的结构,下面是list的节点结构template <class T>struct __list_node { typedef void* void_pointer; void_pointer next; void_pointer prev; T data;};显然这是一个双向链表list的迭代器l...
2018-10-30 14:11:56
256
原创 单例模式
一、面向对象设计原则(一共八种)面向对象设计原则(1)依赖倒置原则(DIP)·高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。·抽象(稳定)不应该依赖于变化),实现细节应该依赖于抽象(稳定)。面向对象设计原则(2)开放封闭原则(OCP)·对扩展开放,对更改封闭。·类模块应该是可扩展的,但是不可修改。面向对象设计原则(3)单一职责...
2018-10-19 19:53:15
254
原创 常见的应用层协议
一、DHCPDHCP概念动态主机配置协议,是一个应用层协议,使用UDP协议工作。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。DHCP操作1.寻找DHCP Server当DHCP客户机第一次登录网络的时候(也就是客户机上没有任何IP地址数据时),它会通过UDP 67端口向网络上发出一个DHCPD...
2018-09-28 17:13:09
11163
1
原创 中断和中断处理
中断中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。中断使得硬件得以发出通知给处理器。中断使得硬件得以发出通知给处理器。例如,在敲击键盘时,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下。中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向操...
2018-09-25 10:09:42
1017
原创 linux中的定时器
定时器网络程序经常需要处理的一类事件是定时器事件,服务器程序通常管理着众多定时事件,因此有效低组织这些定时事件,使之能在预期的时间点被触发而不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响。为此,将每个定时事件分别封装成定时器,并使用某种容器类数据结构,比如链表、排序链表和时间轮,将所有定时器串联起来,以实现对定时事件的统一管理。在讨论如何组织定时器之前,先要介绍定时的方法。定时...
2018-09-23 14:51:09
327
原创 高性能服务器程序框架
服务器模型C/S模型客户连接请求是随机到达的异步事件,服务器需要使用某种I/O模型来监听这一事件。C/S模型非常适合资源相对集中的场合,并且它的实现也很简单,但其缺点也很明显:服务器是通信的中心,当访问量过大时,可能所有客户都将得到很慢的响应。下面讨论的P2P模型解决了这个问题。P2P模型P2P模型使得每台机器在消耗服务的同时也给别人提供服务,这样资源能够充分、自由地...
2018-09-22 13:11:00
456
原创 观察者模式
“组件协作”模式现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。观察者模式动机在软件构建过程中,我们需要为某些对象建立一种”通知依赖关系“----一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。...
2018-09-21 09:39:55
486
原创 muduo中的客户端的编写
总体来说,客户端的代码和服务端的代码大体相同,主要区别是一个是发起连接,一个是接受连接。客户端的代码#include <muduo/net/Channel.h>#include <muduo/net/TcpClient.h>#include <muduo/base/Logging.h>#include <muduo/net/EventLo...
2018-09-19 22:45:51
1083
1
原创 GCC详解
什么是gcclinux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、链接成可执行文件。gcc工作流程图牢记4个 阶段预处理(生成C文...
2018-09-12 21:21:50
1640
原创 GDB调试多进程和多线程
GDB调试单进程参数列表 命令 命令缩写 命令说明 list l 显示多行源代码 break b 设置断点,程序运行到断点的位置会停下来 info i ...
2018-09-12 19:30:44
573
原创 memset,memcpy,strcat,strcpy,strncpy,strcmy, strstr总结
size_t和int size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。在32位架构中被普遍定义为:typedef unsigned int size_t;而在64位架构中被定义为:typedef unsigned long size_t;size_t在32位架构上是4字节,在64位架构上是8...
2018-09-06 21:25:36
957
原创 UDP回射客户/服务器
UDP特点1.无连接,TCP是基于连接的,在连接的时候需要进行三次握手2.基于消息的数据传输服务,TCP是基于流的数据传输服务,会有粘包问题的产生3.不可靠,表现在数据包可能会丢失、重复、乱序、缺乏流量控制4.一般情况下UDP更加高效。 UDP客户/服务基本模型recvfrom和sendto函数#include<sys/socket.h>ssize...
2018-09-03 20:58:03
394
原创 recv、send以及readv、writev函数
recv、send函数原型#include <sys/socket.h>ssize_t recv(int sckfd,void *buff,size_t nbytes,int flags);ssize_t send(int sckfd,const void *buff,size_t nbytes,int flags);这两个 函数类似标准的read和write函数,...
2018-09-02 21:42:14
1444
原创 点对点聊天程序的实现
服务端#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#include <stdlib.h&g
2018-09-02 19:54:57
1596
原创 策略模式
“组件协作”模式现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。策略模式动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?...
2018-09-02 14:30:22
248
原创 简单工厂模式
简单工厂模式简介简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。包含的角色简单工厂模式包含三个角色:(1)工厂类Factory:工厂类是用来制造产品的。因此,在Factory中有一个用于制造产品的Create函数或者Ge...
2018-09-02 09:53:42
244
原创 抽象工厂模式
“工厂方法模式”属于“对象创建”模式“对象创建”模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。抽象工厂模式动机在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作。同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法,提...
2018-08-31 22:11:34
132
原创 工厂方法模式
“工厂方法模式”属于“对象创建”模式“对象创建”模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。工厂方法模式动机在软件系统中,经常面临着创建对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕开常规的对象创建方法,提供一种“封装机制”来避免客户...
2018-08-31 19:52:39
148
原创 模板与泛型编程
定义模板函数模板1.实例化函数模板当我们调用一个函数模板时,编译器(通常)用函数实参来推断模板实参。cout<<compare(1,0)<<endl;//推断实参类型为int2.非类型模板参数除了定义类型参数,还可以在模板中定义非类型参数。一个非类型参数表示一个值而非一个类型。我们通过一个特定的类型名而非关键字class或typename来指定非类...
2018-08-29 19:43:50
330
原创 右值引用和对象移动
右值引用右值C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。 所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。右值是指临时的对象,它们只在当前的语句中有效。右值引用概念为了支持移动操作,C++11引入了一种新的引用类型-右值引用。就是必须绑定到右值的引用。我们通过&&而不...
2018-08-26 18:55:45
378
原创 小心:数组作为形参以及返回数组指针
数组作为形参知识点1.数组的维度必须是一个常量表达式int main(void){ constexpr int i = 20; int j = 5;//不是常量表达式 int arr1[i];//正确 int arr2[j];//错误 system("pause"); return 0;}2.默认情况下,数组的元素被默认初始化。而且需要注意的是,和内置类型的变量一样,...
2018-08-24 20:52:16
2203
原创 处理类型
类型别名定义类型别名有两只方法,分别是:使用关键字:typedef (传统方法)使用关键字:using (新标准)typedef char* pstring;const pstring cstr = 0; // cstr 是指向char的常量指针(**const被识别为顶层const**)using int32_t = int; //int32_t是int的同义词aut...
2018-08-22 22:04:49
271
原创 信号
定义:在计算机科学中,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,由内核产生,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。信号的优先级比较高,进程收到信号之后,暂停正在处理...
2018-08-18 22:16:32
302
原创 Linux中的库
1.库是什么?库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。2.如何使用?用户需要同时具有头文件和库。头文件(相当于说明书的作用,能够知道这个库能干嘛)制作出来的库(具体的实现,存放.c、.cpp)3.静态库的制作和使用(1)命名规则静态库文件名的命名方式是“...
2018-08-16 12:59:10
4175
原创 Linux入门知识点
1.wangkai:代表当前登录的用户@:at,在wangkai-virtual-machine:安装的时候指定的主机名~:用户的家目录(宿主目录)~/C++:当前用户的工作目录$:代表当前用户为普通用户,如果是#的话,就代表超级用户2.Linux系统目录结构根目录下的常见目录:目录 应放置档案内容 /bin /bin放置的是在单人维护模...
2018-08-15 22:08:35
405
原创 文件和目录的一些函数和命令
函数系列七种文件类型普通文件类型Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]目录文件就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]块设备文件块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是...
2018-08-15 14:59:39
416
原创 文件IO
C库函数和系统函数的关系系统调用:由操作系统实现的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。C库虚拟地址空间pcb和文件描述符表与文件IO相关的系统函数1. open作用:open函数打开和创建文件函数原型:int open(...
2018-08-15 11:09:33
221
原创 muduo库如何支持多线程
EventLoopThread(IO线程类)EventLoopThreadPool(IO线程池类)IO线程池的功能是开启若干个IO线程,并让这些IO线程处于事件循环的状态图中的每个Reactor都属于一个线程,mainReactor关注的是acceptor,也就是监听套接字相关的事件,subReactor关注的是已连接套接字相关的事件。也就是说,每新到一个连接,就选择一个subReacto...
2018-07-26 12:47:01
943
原创 简单线程池实现
目标1.用于执行大量相对短暂的任务2.当任务增加的时候能够动态的增加线程池中线程的数量值到达一个阈值3.当任务执行完毕的时候,能够动态的销毁线程池中的线程4.该线程池的实现本质上也是生产者与消费者模型的应用。生产者线程向任务队列添加任务,一旦队列有任务到来,如果有等待 线程就唤醒来执行任务,如果没有等待线程并且线程数没有达到阈值,就创建线程来执行任务。线程池拥有若...
2018-07-23 21:49:08
233
原创 Unix域套接字
Unxi域套接字并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API就是在不同主机上执行客户/服务器通信所用的API。可以视为IPC方法之一。UNix域提供两类套接字:字节流套接字(类似TCP),数据报套接字(类似UDP)UNIX域协议特点:1.Unix域套接字往往比通信两端位于同一主机的TCP套接字快出一倍。X Window System发挥了Unix域套...
2018-07-23 15:23:40
3505
原创 仿函数和配接器
先说一下STL提供的六大组件,彼此之间可以组合套用1、容器(Containers):各种数据结构,如:vector、list、deque、set、map。用来存放数据。从实现的角度来看,STL容器是一种class template。2、算法(algorithms):各种常用算法,如:sort、search、copy、erase。从实现的角度来看,STL算法是一种 function temp...
2018-07-22 20:16:25
455
原创 Effective C++(条款41-52)总结
条款41:了解隐式接口和编译期多态1.classes和templates都支持接口和多态(polymorphism)。2.对classes而言接口是显式的,以函数签名(函数名称、参数类型、返回类型)为中心。多态则是通过virtual函数发生于运行期。显式接口:由于下面代码w的类型被声明为Widget,所以w必须支持Widget接口。如w.size()的成员函数的调用,又如,temp.n...
2018-07-12 20:12:34
513
原创 Effective C++(条款26-40)总结
条款26:尽可能延后变量定义式的出现时间1.尽可能延后变量定义式的出现。这样可以增加程序的清晰度并改善程序效率。不只应该延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参为止。如果这样,不仅能够避免构造(和析构)非必要对象,还可以避免无意义的default构造行为。string encryptPassword(const string& ...
2018-07-11 21:35:07
686
原创 函数的重载、重写、重定义
函数重载(overload)函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:(1)相同的范围(在同一个作用域中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);(5)返回值可以不同;函数重写(也称为覆盖 override)...
2018-07-11 15:17:29
6503
1
原创 Effective C++(条款01-25)总结
条款01:视C++为一个语言联邦1.C2.面向对象的C++3.C++模板4.STL条款02:尽量以const,enum,inline替换#define1.对于单纯常量,最好以const对象或enum替换#define。const相比于define的好处: define直接常量替换,出现编译错误不易定位(不知道常量是哪个变量)define没有作用域,const...
2018-07-10 21:29:02
468
原创 C++初始化类的常量数据成员、静态数据成员、常量静态数据成员
有关const成员、static成员、const static成员的初始化:1、const成员:只能在构造函数后的初始化列表中初始化(C++98); (C++11提供了类内初始化,因此内类常量可在声明类时进行类内初始化,因此该类内常量的作用域属于类级,即该类的所有对象均具有同一个值。)#include <iostream>using namespace std;class A ...
2018-07-10 10:22:08
8426
2
原创 匿名管道和有名管道
1. 管道的概念本质: 内核缓冲区 伪文件 - 不占用磁盘空间特点: 两部分: 读端,写端,对应两个文件描述符 数据写端流入, 读端流出 操作管道的进程被销毁之后,管道自动被释放了 管道读写两端默认是阻塞的 2. 管道的原理内部实现方式:队列 环形队列 特点:先进先出缓冲区大小: 默认4k,通过ulimit -a查看3. 管道的局限性队列: 数据只能读取一次,不能重复读取半...
2018-07-08 17:27:20
1452
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅