自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Singleton模式

Singleton 模式典型的结构图为:在 Singleton 模式的结构图中可以看到,我们通过维护一个 static 的成员变量来记录这个唯一的对象实例。通过提供一个 staitc 的接口 instance 来获得这个唯一的实例。完整代码实现示例(code)#include<iostream>using namespace std;class Singleton{public...

2018-05-31 20:44:48 171

原创 单向链表反转(倒置)问题

今天遇到单向链表的反转的问题,于是静下心来好好想了一番。 解题思路如下图:假设当前创建好的链表如下:首先让头节点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个元素节点的位置,然后再断开。在这里有一个指针q指向一个指针域为空的节点,这个节点用来做为链表反转后的最后一个节点。让第二个元素节点的指针从指向第三个元素节点变为指向第一个元素节点,以此类推,直至指针p指向...

2018-05-31 11:26:01 362

原创 gdb调试器

1、启动和退出gdb如果一个可执行文件可以被gdb调试,那么在使用编译器gcc编译程序时需要加入-g选项。-g选项告诉gcc在编译程序时加入调试信息,这样gdb才可以调试这个被编译的程序。gdb调试的是可执行文件。gdb调试一个程序的命令格式是:gdb 程序文件名启动gdb后,首先显示了一段版权说明,然后是gdb的提示符:(gdb)。可以在(gdb)之后输入调试命令。如果要使gdb启动时不输出版权...

2018-05-25 16:28:21 264

原创 make的使用和Makefile的编写

Linux环境下的大型项目中,通常把整个系统划分为若干模块,每个模块完成某一相对独立的功能,各个模块相互作用以构成一个完整的系统。对于这样的软件系统,是不可能只使用一条或几条gcc命令就可以编译成可执行程序的。而且模通常要经历几次修改,每次模块修改后如果都由人工来输入命令以完成编译,这样既效率低又容易出错。在Linux中,有一个用来维护程序模块关系和生成可执行程序的工具—make。它可以根据程序模...

2018-05-25 15:26:12 297

原创 函数对象基本概念及分类和算法

所谓函数对象其实就是一个行为类似函数的对象,它可以不需参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。在C++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用。常用的函数对象函数适配器STL中定义了大量的函数对象,但是有时候需要对函数返回值进行进一步的简单计算,或者填上多余的参数,不能...

2018-05-21 22:19:32 756

原创 迭代器

迭代器是泛化的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器中每个元素的方法。虽然指针也是一种迭代器,但迭代器却不仅仅是指针。迭代去更为抽象,它可以指向容器中的一个位置,我们不必关心这个位置对应的真正物理地址,只需要沟通过迭代器访问这个位置的元素。STL中迭代器是算法和容器的中间人。STL的每一个容器类模板中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访...

2018-05-21 18:43:34 266

原创 多态性

面向对程序设计的真正优势不仅仅在于继承,还在于将派生类对象当基类对象一样处理的功能。支持这种功能的机制就是多态和动态绑定。多态是同样的消息被不同类型的对象接收会导致不同的行为。专用多态1、重载多态普通函数及类的成员函数的重载都属于重载多态,加法运算方别使用于浮点数、整型数之间就是重载的实例。2、强制多态将一个变元的类型加以变化,以符合一个函数或者操作的要求,加法运算在进行浮点数与整型数相加时,首先...

2018-05-21 14:51:55 3216

原创 派生类的构造和析构函数

派生类的构造函数只负责对派生类新增的成员进行初始化,对所有从基类继承下来的成员,其初始化工作还是由基类的构造函数完成。派生类构造函数执行的一般次序如下:(1)调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左到右)。(2)对派生类新增的成员对象初始化,调用顺序按照它们在类中声明的顺序。(3)执行派生类的构造函数体中的内容。虚基类:1、将共同基类设置为虚基类,这时从不同的路径继承过来的同名数...

2018-05-21 10:56:55 453

原创 C++类型兼容规则

类型兼容规则则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。类型兼容规则中所指的替代包括一下的情况:1、派生类的对象可以隐含转换为基类对象2、派生类的对象可以初始化基类的引用3、派生类的指针可以隐含转换为基类的指针...

2018-05-21 08:48:51 796

原创 C++继承与派生

继承:以原有类为基础产生新的类,我们就说新类继承了原有类的特征,也可以说是从原有类派生出新类。派生机制优点:代码的重用性和可扩展性。通过继承可以充分利用别人做过的一些类似的研究,和已有的一些分析、解决方案。重用这些代码,便使自己的开发工作可以站在巨人的肩膀上。软件开发完成后,当问题有了新的发展或对问题有了新的认识时,也能高效地改造和扩充已有的软件。继承方式:规定了如何访问从基类继承的成员。系统的默...

2018-05-21 08:40:44 430

原创 UML图形标识与泛型程序设计

UML语言是一种典型的面向对象建模语言,而不是一种编程语言,在UML语言中用符号描述概念,概念间的关系描述为连接符号的线。UML类图一个类图是由类和与之相关的各种静态关系共同组成的图形。类图展示的是软件模型的静态结构、类的内部结构以及和其它类的关系。通过类图,完全能够描述本书中介绍的面向对象的相关概念(如类、模板类等),以及它们的相互关系。类图是描述类或对象的图形标识以及描述它们之间的 相互关系的...

2018-05-20 22:33:25 1869

原创 面向对象的基本概念

1、对象面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象是一组属性和一组行为构成。属性是用来描述对象静态特征的数据项,行为是用来描述动态特征的操作序列。2、类面向对象方法中的“类”是具有相同属性和服务的一组对象的集合。类与对象的关系犹如模具与铸件的关系,一个属于某类的对象称为该类的一个实例。3、封装封装是面向对象方法的一个重要原则,就是把对象的属性和服...

2018-05-20 21:14:02 1013

原创 TCP/IP分层管理

TCP/IP各层的作用:应用层:应用层决定了向用户提供应用服务时通信的活动。协议:FTP,DNS,HTTP等传输层:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输协议:TCP、UDP等网络层(又名网络互连层):网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台...

2018-05-19 12:14:37 245

原创 传输层:TCP、UDP

UDP是一个简单的、不可靠的数据报协议,而TCP是一个复杂的、可靠的字节流协议。TCP是一个面向连接的协议,为用户提供可靠的全双工字节流,TCP套接字是一种流式套接字。TCP关心确认、超时和重传之类的细节。UDP是一种无连接的协议。UDP是一个无连接的协议。UDP套接字是一种数据报套接字。UDP数据报不能保证最终到达它们的目的地。ARP地址解析。ARP把一个IPv4地址映射成一个硬件地址。RARP...

2018-05-19 11:18:41 219

原创 共享内存区介绍

共享内存区是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间的数据的传递就不再涉及内核。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步。        最后,将这些数据从由write函数的第二个参数指定的客户缓冲区复制到输出文件。...

2018-05-19 10:39:20 326

原创 System V信号量

●二值信号量:其值或为0或为1的信号量。这与互斥锁类似。若资源被锁住则信号量为0,若资源可用则信号量值为1。●计数信号量:其值在0和某个限制值之间的信号量。这两种类型的信号量中,等待操作都等待信号量的值变为大于0,然后将它减1。挂出(post)操作则只是将信号量的值加1,从唤醒在等待该信号量值变为大于0的任何线程。●计数信号量集:一个或者多个信号量(构成一个集合),其中每个都是计数信号量。semg...

2018-05-19 09:49:05 270

原创 读写锁

互斥锁把试图进入我们称之为临界区的所有其他进程都阻塞住,该临界区通常涉及对由这些线程共享的一个或多个数据的访问或更新。然而有的时候我们可以在读某个数据与修改某个数据之间做区分。获取与释放读写锁读写锁的数据类型为pthread_rwlock_t,如果这个类型的某个变量是静态分配的,那么可通过给它赋常值PTHREAD_RWLOCK_INITIALIZER来初始化它。读写锁属性...

2018-05-18 21:29:31 168

原创 进程或线程间同步(互斥锁和条件变量)

为允许在线程或这进程间共享数据,同步通常是必须的。互斥锁和条件变量是同步的基本组成部分。互斥锁和条件变量总是可用来同步一个进程间内的各个线程的。如果一个互斥锁或条件变量存放在多进程间共享的某个内存区中,那么也允许它用于这些进程间的同步。应用生产者-消费者问题,使用多个线程而不是多个进程,因为让多个线程共享本问题中采用的公共数据缓冲区非常简单,而在多个进程间共享一个公共数据缓冲区却需要某种形式的共享...

2018-05-18 21:07:35 1184

原创 Posix消息队列和System V消息队列

Posix消息队列比较简单:System V消息队列则使用消息队列标识符标识,具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息。跟Posix消息队列一样,在某个进程往一个队列中写入一个消息之前,不求另外某个进程正在等待该队列上一个消息的到达。我们可以将内核中的某个特定的消息队列画为一个消息链表。System V消息队列函数:1)msgg...

2018-05-18 20:23:42 1048

原创 IPC

IPC是进程间通信的简称。我们在一个系统上运行多个进程,每个进程都有各自的地址空间。Unix进程间的信息共享可以有多种方式。(1)左边的两个进程共享留于文件系统的某个文件的某些信息。为了访问这些信息,每个进程都得穿越内核(read、write)。当有一个文件有待更新时,某种形式的同步是有必要的,这样既可以保护多个写入者,防止相互串扰,也可以保护一个或者多个读出者,防止写入者的干扰。(2)中间的两个...

2018-05-18 20:04:18 367

原创 C++智能指针

auto_ptr1、保证一个对象在某个时间只能被一个该种类型的智能指针所指向,就是通常所说的对象所有权;2、对指向的对象自动释放的作用;3、auto_ptr不能管理数组,因为析构调用的是delete,如果管理数组的话,需要调用delete[];shared_ptr   引用计数的智能指针,用于共享对象的所有权。是C + +标准库中一个聪明的指针,是为多个拥有者管理内存中对象的生命周期而设计的。在你...

2018-05-16 09:56:20 189

原创 C++ explicit关键字详解

首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的类声明, 即默认...

2018-05-16 09:24:33 155

原创 C/C++字节对齐

仔细讨论 C/C++ 字节对齐问题字节对齐的原因    为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐。对齐方式    对于 struct 或 union 中的 struct 或者 union 来说,它们的字节对齐标准就是它的所有成员中字节数最大的数据的字节数。一般情况下 C/C++ 的变量所占用的字节数        char:    1字节...

2018-05-16 08:43:41 280

原创 System V IPC

以下三种类型的IPC合称为System V IPC:& System V 消息队列&System V 信号量&System V共享内存区这个称谓作为这三种IPC机制的统称是因为它们源自System V Unix。                                                      三种类型的System V IPC使用key_t值作为它...

2018-05-15 08:40:20 598

原创 Linux管道的实现机制

在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: 1)限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的wri...

2018-05-14 21:27:33 2098

原创 进程间双向通信--sockpair

sockpair是一个套接字,可以用于网络通信,也可用于本机内进程间通信。sockpair类似于管道,只不过管道是用于单向通信的,只能一方读,一方写,。而想要用于进程间双向通信,就要pipe两次,创建两个管道。sockpair直接就可以实现进程间双向通信。  1 #include<stdio.h>  2 #include<unistd.h>  3 #include&lt...

2018-05-14 21:13:26 1218

原创 inet_pton函数和inet_ntop函数

2018-05-14 10:41:54 1687

原创 IPv4套接口地址结构

2018-05-14 10:34:40 437

原创 可重入函数与不可重入函数

主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着...

2018-05-14 10:08:26 168

原创 字节操纵函数

2018-05-09 16:47:49 402

原创 【总结】学习Socket编写的聊天室小程序

1.前言在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路。传输协议TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。特点:面向连接的协议,数据传输必须...

2018-05-09 10:06:39 552

原创 epoll对文件描述符的两种操作模式:LT和ET模式

2018-05-08 22:19:56 672

原创 I/O复用

I/O复用使得程序可以同时监听多个文件描述符,这对提高程序的性能至关重要。需要指出的是I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来是串行工作的。如果要实现并发,只能使用多进程或多线程等手段。Linux下实现I/O复用的系统调用主要有select、poll、epo...

2018-05-08 22:06:13 191

原创 基本套接口编程

TCP/UDP端口号总在套接口地址结构中总是以网络字节序来存储。         套接口地址结构仅在给定主机上使用,虽然结构中的某些成员(如IP地址和端口号)用在不同主机间的通信中,但结构本身并不参与通信。为了执行网络I/O,一个进程必须要做的第一件事是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP、Unix域字节流协议等)。#include<sys...

2018-05-04 20:09:05 508

原创 多态与虚函数

多态性是面向对象程序设计的关键技术之一,若程序设计语言不支持多态,不能称为面向对象的语言,利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。C++有两种多态性1.、编译时的多态性,通过函数的重载和运算符的重载来实现的。2、运行时的多态性,是在程序运行前,无法根据函数名和参数来确定该调用那一个函数,必须在程序的执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现...

2018-05-04 12:13:04 148

原创 希尔排序

希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错。首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高。下面有颜色的是逻辑上的分组,并没有实际地进行分组操作,在数组中的位置还是原来的样子,只是将他...

2018-05-02 19:58:18 180

原创 随机排列算法及《算法导论》5.3节习题解答

《算法导论》介绍了两种随机排列数组的算法。  第一种算法是为数组的每个元素A[i]赋一个随机的优先级P[i],然后依据优先级对数组A中的元素进行排序。例如,如果初始数组A=(1,2,3,4),随机选择的优先级P=(36,3,62,19),则将产生一个数组B=(2,4,1,3),因为第2个优先级最小,接下来是第4个,然后第1个,最后第3个。我们称这个过程为PERMUTE-BY-SORTING:123...

2018-05-02 10:59:06 829

空空如也

空空如也

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

TA关注的人

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