自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树面试题以及线索化二叉树

二叉树面试题完整代码:#include <iostream>using namespace std;#include <queue>#include <stack>template<class T>//孩子表示法struct son{ son(const T& data) : _left(NULL) , _right(NULL) , _data(data)

2017-08-24 23:35:35 2270 1

原创 递归->栈->队列面试题

本文所有程序均已测试通过,测试结果图就不一个一个再截图了;读者可以自己copy验证一下;后期我会把思路图补出来1.行走机器人问题:货架N个,机器人初始位置在pos,经过minutes分钟后到达T有多少种方案//行走机器人问题:货架N个,机器人初始位置在pos,经过minutes分钟后到达T有多少种方案int Walkrobb(int n, int pos, int minutes, int t)

2017-08-18 21:40:43 2205

原创 智能指针

智能指针智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造

2017-08-05 23:48:17 1516 1

原创 C++实现Vector->类型萃取和List->迭代器

容器1.Vector(也可以称之为顺序表)#include <iostream>using namespace std;#include <assert.h>template <class T>class Vector{public: Vector()//构造函数 :_data(NULL) , _size(0) , _capa(0)

2017-08-03 13:09:04 1334

原创 shell脚本

shell脚本()单括号和“反引号的区别注意:编写shell脚本时,定义变量时不加$,使用时要加$,用以区别字符串。首先,我们来看一个例子#!/bin/basha=1b=2c=`date "+%Y-%m-%d"`echo $cc=$(date "+%Y-%m-%d") echo $

2017-08-03 13:08:09 1017

原创 poll->epoll服务器

pollmakefilemypoll:mypoll.c gcc -o $@ $^.PHONY:cleanclean: rm -f mypollmypoll#include <stdio.h>#include <poll.h>int main(){ struct pollfd ev; ev.fd = 0; ev.events = POLLIN;

2017-07-31 15:36:38 1060

原创 select服务器

selcetmakefileselect_server:select_server.c gcc -o $@ $^.PHONY:cleanclean: rm -f select_serverselect_server.c#include <stdio.h>#include <sys/select.h>#include <sys/types.h>#include <netin

2017-07-31 15:32:33 1119

原创 TCP->多进程服务器->多进程服务器->线程池

TCP流式套接字makefile 1 2 .PHONY:all 3 all:tcp_client tcp_server 4 5 tcp_client:tcp_client.c 6 gcc -o $@ $^ -stat

2017-07-31 14:58:32 966

原创 菱形继承(虚函数)->菱形虚拟继承(虚函数)->多态系列问题

读者注意:阅读这篇文章时,对继承中的对象模型要有一定了解;觉得自己不确定的话单击下面的“继承”。继承多态多态按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。直白点理解就是不同的对象收到相同的消息时,产生不同的动作。(随风倒)多态可以分为静态多态和动态多态。 静态多态:是在编译器期间完成的,也叫早期绑定; 动态多态:在程序执行期间(非编译期)判断所引用对象的实际类

2017-07-27 13:53:21 3300

原创 菱形继承->菱形虚拟继承(继承系列问题)

//待解决:如何在类外访问类的私有成员(友元函数和offsetof) //如何在一个类外访问另外一个类的私有成员 //用C语言模拟实现继承继承(继承权限public->protected->private)继承是面向对象复用的重要手段,通过继承定义一个类,继承是关系类型之间的建模, 共享共有的东西,实现各自本质不同的东西。在继承关系当中,派生类继承父类的成员由此达到复用手段。public继承是一

2017-07-21 17:41:18 2796 2

原创 Tcp->三次握手和四次挥手

TCP协议中的三次握手和四次挥手建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:先来看看如何建立连接的。首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。那如何

2017-07-20 03:06:19 1019

原创 URG和PSH的区别与联系

URG(紧急位): 急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数�D(D�的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)PSH(急迫位): 在一个交互程序中,当客户发送一个命令给服务器时,它设置P U S H标志并停下来等待服务

2017-07-20 02:58:38 1368

原创 C++实现顺序表->单链表->双向链表

C++实现顺序表Seqlist.h#pragma oncetypedef int DataType;#include<assert.h>class Seqlist{public: Seqlist()//构造函数 :_data(NULL) , _size(0) , _capa(0) { } ~Seqlist()//

2017-07-20 02:30:31 1344

原创 写时拷贝

怎么样解决浅拷贝中同一块空间被释放多次?在深浅拷贝中我们提到过浅拷贝的两大缺点,并且用现代深拷贝和传统深拷贝去解决它。当然,我们除了用深拷贝以外,常用的还有引用计数的浅拷贝。引用计数的浅拷贝如何实现:我们为每个内存的字符数组添加一个引用计数pcount,即就是在构造函数申请空间的时候多申请出来4个字节。表示有多少个对象使用这块内存,有多少个对象使用,就让pcount值加1,当对象被析构的时候,让pc

2017-07-16 16:46:53 850

原创 String类

String.h#pragma once#include<iostream>using namespace std;#include<assert.h>class String{public: String(char *str = "")//构造函数 { _size = strlen(str); _capa = _size;

2017-07-15 12:15:56 729

原创 深浅拷贝

浅拷贝简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。举个例子:#include<iostream>using namespace std;#include<string.h>class String{public: String(char *str="") {

2017-07-14 12:22:50 712

原创 动态内存管理

1.总结并剖析malloc/free和new/delete之间关系和差异malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。

2017-07-14 00:37:48 769

原创 构造拷贝构造的N中调用情况的问题

简单的写一个日期类,包含四个默认成员函数注意:调用构造函数的次数+调用拷贝构造的次数=析构的次数 本例中 有一个Date变量和main函数的生命周期是一样的,所以会少一次析构。 如果把测试用例封装到函数中,则调用析构的次数正确。#pragma once#include<iostream>using namespace std;class Date{public: Date()

2017-07-13 19:22:20 1020

原创 日期类->日期计算器

date.h#pragma once#include<iostream>using namespace std;class Date{ friend ostream& operator<<(ostream& out, const Date& d); friend istream& operator>>(istream& out, Date& d);public: Da

2017-07-13 00:32:32 1114

原创 complex类

complex.h 复数的四则运算不懂得网上都有,直接贴代码#pragma once#include<iostream>using namespace std;class Complex{public: //四个成员函数 Complex(double real = 0.0, double image = 0.0)//构造函数 { cout <<

2017-07-12 21:30:33 1124

原创 类和对象->四个默认成员函数->运算符重载

类和对象类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,或者说是通过类这种数据类型创建出来的一份实实在在的数据,所以占用内存空间。 类的定义 类是用户自定义的类型,如果程

2017-06-25 16:21:39 1238

原创 路由表生成算法以及收敛路由原理

路由表简介路由:数据包从源地址到目的地址所需要经过的路径,由一系列节点组成。 路由节点:一个具有路由功能的主机或者路由器,维护一张路由表,通过查询路由表来决定向那个节点发送数据包。 路由表:由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接收和发送,其中最后一个是缺省路由条目。 路由条目:路由表中的每一行,每个条目主要由网络地址、子网掩码、下一跳地址、发送接收四部分组成

2017-06-24 20:32:33 5243

原创 NAT技术与代理服务器详解

NAT技术原理与应用1 概述1.1 简介1.1.1 名词解释公有IP地址:也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。私有IP地址:也叫内部地址,属于非注册地址,专门为组织机构内部使用。因特网分配编号委员会(IANA)保留了3块IP地址做为私有IP地址:10.0.0.0 ——— 10

2017-06-24 19:44:24 3719

原创 ARP协议以及获取MAC脚本

arp协议 : 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个

2017-06-24 11:54:00 2222

原创 CRC校验

基本概念对应关系:多项式和二进制数有直接对应关系:X的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:X的最高幂次为R,转换成对应的二进制数有R+1位。 多项式包括生成多项式G(X)和信息多项式C(X)。 如生成多项式为G(X)=X4+X3+X+1,可转换为二进制数码11011。 而发送信息位1111,可转换为数据多项式为C(X)=

2017-06-24 11:48:46 984

原创 网络服务端口分类

1. 一共有多少有效端口?计算机一共有65535个有效端口,但是一般使到的也就是十几个2.端口是如何分类的?端口可分为3大类: 1) 公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。 2) 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一

2017-06-18 22:58:37 767

原创 C++入门基础知识

1.命名空间C++ Namespace 详解 命名空间的定义格式为:(取自C++标准文档)named-namespace-definition: namespace identifier { namespace-body }unnamed-namespace-definition: namespace { namespa

2017-06-18 20:24:19 535

原创 守护进程

一、什么是守护进程1、守护进程的引入 在现实生活中, 许多大型的软件或服务器必须保证7*24小时(一周7天,一天24小时)无障碍的运行,例如淘宝网、百度搜索引擎、支付宝等等,那么像这样一种要一直运行的程序怎么实现呢?究其本质其实就是我们的守护进程。2、守护进程的定义 守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的

2017-06-18 14:56:47 845

原创 子进程的异步等待方式

等待: 等待有阻塞等待和非阻塞等待。 我们用非阻塞等待来实现异步。 1, 子进程终止时会给父进程发送SIGCHLD信号 2, 为了验证子进程在退出时确实向父进程发送了SIGCHLD信号,我们对SIGCHLD信号进行捕捉 3,#include<stdio.h>#include<stdlib.h>#include<sys/wait.h>#include<signal.h>#includ

2017-06-15 16:25:32 549

原创 对比线程安全和可重入函数

可重入函数函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次 进入该函数,这称为重入。 然而有可能因为重入而造成错乱,像这样 的函数称为不可重入函数, 反之,如果一个函数只访问自己的局部变量或参数,则称为可重入 (Reentrant) 函数。 可重入函数: 重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static)

2017-06-15 16:20:02 416

原创 信号的捕捉与模拟实现sleep函数

信号的捕捉:如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。 信号的处理有三种方式。 那么它是在什么时候处理信号的呢? 我们来看一张图。 0,一张图,两半,上为用户态(运行态),下面为内核态(管理态)。 1, 上图为信号的捕捉,处理流程。 2,图中3,4 是为了处理用户自定义的句柄。 3,图中有4个内核与用户的切换。 4,用户处理信号的时机:从内核

2017-06-15 16:15:47 722

原创 基于单链表的面试题——进阶篇

点击查看如何实现单链表以及单链表的一些基本操作函数 点击查看基于单链表经常见的面试题——基础篇1.判断单链表是否带环?若带环,求环的长度?求环的入口点? 判断是否带环:ListNode *IfRing(ListNode *list)//判断单链表是否带环,返回交点{ ListNode* slow = list; ListNode* fast = list; //是否带环

2017-06-12 14:07:37 985 1

原创 基于单链表经常见的面试题——基础篇

点击进入查看如何实现链表以及链表的一些基本操作函数 基于单链表的面试题——进阶篇1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用?首先我们时间上来进行分析:(1)对于顺序表。不论是静态的还是动态的,他们都是连续的存储空间,在读取上时间效率比较快,可以通过地址之间的运算来进行访问,但是在插入和删除操作会出现比较麻烦的负载操作。 (2)对于链表,因为他是链式存储。在我们需要的时候才在堆上开

2017-06-09 21:18:49 1668

原创 实现无头结点单链表的基本操作函数

基于单链表经常见的面试题——基础篇 基于单链表的面试题——进阶篇什么是无头结点链表??? singlelinkedlist.h头文件#ifndef __SINGLELINKEDLIST_H__#include<stdio.h>#include<windows.h>#include<assert.h>typedef int DataType;typedef struct ListNode

2017-06-09 17:29:41 8927 1

原创 c语言经典面试题

上面两幅图中有六道经典C语言面试题,真的可以认真看看!!!直接贴代码:#include<stdio.h>#include<windows.h>#include<assert.h>void bit_set(unsigned char *p_data, unsigned char position, int flag){ assert(p_data!=NULL); if ((pos

2017-06-05 18:35:16 1210

原创 阻塞信号

一,信号在内核中的表示1,在此之前,必须先了解几个概念: 信号递达(Delivery):实际执行信号处理的动作。 信号未决(Pending):信号从产生到递达之间的状态。 信号阻塞(Block):被阻塞的信号产生时将保持在未决状态,直到 进程解除对此信号的阻塞,才 执行递达的动作。注意:信号阻塞和信号忽略是不同的。只要信号被阻塞就不会递达,除非解除阻塞,而忽略是在递达之

2017-06-05 12:54:13 791

原创 使用gdb和core dump如何快速定位到段错误

这篇文章主要介绍的就是在产生段错误时如何快速定位到错误的位置? 一.一个简单的关于段错误的实例   [cpp] view plain copy#include  #include    void handler(int sign)  {      printf("pid is %d,signnum is %d\n"

2017-06-05 12:24:19 4924

原创 基于单链表、环形队列(并发有锁)的多线程生产者消费者模型

在这之前的我已经介绍过生产者消费者模型,不懂的可以下跳地址: http://blog.csdn.net/quinn0918/article/details/728259921、环形缓冲区缓冲区的好处,就是空间换时间和协调快慢线程。缓冲区可以用很多设计法,这里说一下环形缓冲区的几种设计方案,可以看成是几种环形缓冲区的模式。设计环形缓冲区涉及到几个点,一是超出缓冲区大小的的索引如何处理,二是如何表示缓

2017-06-03 22:59:25 2216

原创 实现静态顺序表和动态顺序表

其实顺序表的静态实现以及动态实现和通讯录的实现原理基本上是一致的,在这里就不做过多的解释,直接贴代码。 静态通讯录:http://blog.csdn.net/quinn0918/article/details/71937767 动态通讯录:http://blog.csdn.net/quinn0918/article/details/72182598 文件流通讯录:http://blog.csd

2017-06-02 18:58:53 773

原创 互斥锁死锁状态详解

在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。那么到底怎样的情形才会产生死锁呢? 典型的两种死锁情形: (一)线程自己将自己锁住 一般情况下,如果同一个线程先后两次调用lock,在第二次调⽤用时,由于锁已经被占用,该线程会挂起等待占用锁的线程释放锁,然而锁正是被自己占用着

2017-06-01 01:53:16 10251

空空如也

空空如也

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

TA关注的人

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