读书笔记
文章平均质量分 72
万木春《Linux 后端开发工程实践》
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
常用字符串hash函数总结
/** * FileName: allHash.cpp * Author: ACb0y * Create Time: 2011年3月20日21:55:53 * Last Modify Time: 2001年3月21日0:00:22 */ #include using namespace std;typedef unsigned int uint;typedef struct node { char * str; struct node * pNext;}n原创 2011-03-21 00:16:00 · 5453 阅读 · 4 评论 -
C++读书笔记之第四类类型转换(reinterpret_cast)
C++读书笔记之第四类类型转换(reinterpret_cast)第四种新的类型转换reinterpret_cast转换结果常常是由(编译器)实现所定义的,因此,reinterpret_cast?几乎是不可移植的。reinterpret_cast最常见的用法是用来在函数指针之间的一种类型转换。比如说,假设你有一个指针数组,这些指针指向特定类型的函数:typedef void (*FuncPtr) ();FuncPtr funcPtrArray[10];//funcPtrArray is a array of原创 2011-02-28 22:43:00 · 1433 阅读 · 0 评论 -
C++关键字之explicit
C++关键字之explicit<br />c++中一个关键字为explicit,这个关键字是用来表明系统不能默认调用类的转换构造函数,要进行类型转换构造函数的调用,需要显示调用。<br />Demo代码如下:<br />/* FileName: explicitDemo.cpp Author: ACb0y Create Time: 2011年3月3日11:49:23 */#include <iostream>using namespace std;//测试类class Tes原创 2011-03-03 11:54:00 · 903 阅读 · 0 评论 -
如何用C语言获取文件的大小
如何用C语言获取文件的大小今天看项目的代码过程中发现在linux下获取一个指定文件大小(字节为单位)的代码。查了一下发现是使用系统调用stat来实现,而这引起了我的兴趣,我发现在window下貌似没有提供这样的系统调用(不包括MFC),那么如何使用C语言或C++语言来写一个通用的函数来获取指定文件大小的函数呢?查了一下发现同C语言的文件操作函数便可以很容易的实现这样的功能。在自己实现的函数中使用到的函数就只有fseek和ftell。它们的说明如下:fseek语法: #include int fse原创 2011-02-12 21:03:00 · 16030 阅读 · 2 评论 -
排序算法-中级篇
排序算法-中级篇<br />上一篇文章中我回顾了在学习入门计算机语言时最初接触的排序算法(冒泡排序,选择排序),不管是冒泡排序还是选择排序,它们的效率都不高时间复杂度都为O(n^2),对于大规范的数据出来是不能接受了,因而就需要更高效的排序算法。在这里我回顾一下我们在数据结构与算法这门课学习到的堆排序(O(nlog(n))),算法逻辑我就不赘述了,大家都知道。<br />代码实现上我是用C++的函数模板来实现。<br />实现代码如下:<br />/* FileName: qsort.cpp Aut原创 2011-02-13 17:38:00 · 848 阅读 · 0 评论 -
排序算法-高级篇(基数排序)
排序算法-高级篇在前两篇文章中,我回归了最基本最easy的排序算法(冒泡排序、选择排序)它们的时间复杂度都为O(n^2)和快速排序(时间复杂度为O(nlog(n))),而选择我要回顾的是更为高效的基数排序(基数排序的使用范围有所限制,它只能用在正整数的排序)它的时间复杂度为O(nlog10(max)),max = Max{data[0], data[1], ...}。我程序的实现是从低位->高位进行扫描。下面举个例子。有数据 data[6] = {13, 14, 15, 24, 35, 100},因为max原创 2011-02-13 23:36:00 · 1025 阅读 · 0 评论 -
排序算法-中级篇(归并排序)
/* FileName: MergeSort.cpp Author: ACb0y Create Time: 2011年2月15日14:49:47 Last modify Time: 2011年2月15日15:55:58 */#include using namespace std;/* 函数名: template void print(type * data, int n, char * format); 功能:输出元素序列中所有的元素 参数:原创 2011-02-15 16:35:00 · 980 阅读 · 0 评论 -
排序算法-高级篇(计数排序)
排序算法-高级篇(计数排序)在前一篇的文章中我提到了非比较排序算法(基数排序),现在我要回顾的是另一种非比较排序算法(计数排序),计数排序的原理很 简单就是先统计序列中每个不同的元素出现的次数,然后再统计每个元素在排序后在序列中的位置,然后按照这个位置输出各个元素即可。代码实现如下:/* FileName: countingSort.cpp Author: ACb0y Create Time: 2011年2月14日21:12:31 Last modify Time: 2011年2月15日0:原创 2011-02-15 01:04:00 · 929 阅读 · 0 评论 -
钱能C++语言读书笔记(四)
钱能C++语言读书笔记(四)多继承之虚拟继承(Virtual Inheritance)当一个类(A)从多个类继承(B和C)而来,而这些父类(B和C)中又有共同的父类(E),这样在最后的类A中就有祖父类E的两份拷贝,在多重继承中经常会出现这种情况,在C++在提供了虚拟继承来解决这个问题,通过虚拟继承的方式可以保证类A中只有祖父类E的一份拷贝。多继承之对象构造顺序(Mutli-Inheritance Object Constructing Order)含有多继承的构造函数按下列顺序被调用任何虚拟基类的构造函数按原创 2011-02-23 00:30:00 · 897 阅读 · 0 评论 -
钱能C++语言读书笔记(二)
钱能C++语言读书笔记(二)<br /> <br />1、 有内存申请,也就有内存释放。一般来说,需要定义拷贝构造函数的类,也需要析构函数,不需要拷贝构造函数的类,也无须定义析构函数。所以析构函数与拷贝构造函数是成对出项的。<br />因为析构函数是没有参数的所以函数形式是唯一的,没有重载的析构函数。<br /> 析构函数在对象的生命周期行将结束的瞬时,由系统自动调用。因此,析构函数的调用不是通过显示语句表示的。<br />2、 转换构造函数<br />构造函数:Student(const原创 2011-02-22 21:48:00 · 839 阅读 · 0 评论 -
钱能C++语言读书笔记(六)虚函数的限制
虚函数的限制1、只有类成员函数才能声明为虚函数。这是因为虚函数仅适用于有继承体系的类对象,所以普通函数不能声明为虚函数。2、静态成员函数不能是虚函数。因为静态成员函数不受对象的捆绑,即使形式上的捆绑。实际上也没有任何对象的信息,只有类的信息:void fn(Base & x){ x.Staticfn(); //只用了类的信息。 Base::Staticfn(); //调用静态成员的推荐方式。} 操作不受对象捆绑,也就失去了多态的条件。因为编译是在识别到对象的捆绑操作时,开原创 2011-02-23 23:30:00 · 944 阅读 · 0 评论 -
钱能C++语言读书笔记(三)如何改变类成员的范围属性
钱能C++语言读书笔记(三)如何改变类成员的访问属性<br /> 在派生类中,可以调整成员的访问控制属性。例如:可以将公有成员调整为私有成员,将保护成员调整为公有成员。调整访问控制属性的前提是在派生类中该成员必须是可见的。例如,上述程序中的私有成员b1,不管如何继承,它都是不可见的。在派生类中要访问它必须通过基类的保护或公有成员函数,因此b1就无法在派生类中进行访问属性的调整,它在子孙类中永远是不可见的。<br /> 对于一个成熟的类设计来说,数据成员往往只有私有的,公有的不多见,那都是原创 2011-02-22 23:30:00 · 1011 阅读 · 0 评论 -
钱能C++语言读书笔记(五)
钱能C++语言读书笔记(五)<br /> <br />1、 在高级编程中,都是用无任何牵连的干净界面来分离编程的逻辑单位的,描述界面成为一种编程的高级技巧,多继承技术也十分积极地参与了界面描述。C++标准的未来发展趋势于淡化多重继承。<br />2、 过程化的编程是通过函数模块化的堆积来展开的,它是一种行为抽象的编程。而基于对象的编程是通过抽象数据类型描述的数据对象来展开的。它是一种数据抽象的编程。<br />3、 数据结构:一系列性质相同的数据组织成一定的逻辑结构并带有自身的一系列操作。<br原创 2011-02-23 22:52:00 · 917 阅读 · 0 评论 -
钱能C++语言读书笔记(一)
钱能C++语言读书笔记(一)1、 头文件的内容1.1函数的声明:int Fun(); void Max();1.2全局数据的声明:extern int n;1.3类型声明:class A{};1.4全局常量定义:const float PI = 3.1415926;1.5内联函数定义:inline void fn();1.6模板声明和定义:templateclass A {…};1.7名空间定义:namespace N{};1.8类型定义:enum Color{}; class A{};1.9预编原创 2011-02-22 16:36:00 · 926 阅读 · 0 评论 -
文件操作类
文件操作类<br />近来在项目中发现了很多的文件操作,故自己封装了一个文件操作类。实现代码如下:<br />/* FileName: FileOperation.cpp Author: ACb0y Create Time: 2011年3月15日20:15:03 Last Modify Time: 2011年3月15日22:52:37 */#include <iostream>using namespace std;//文件各种操作的返回值const int FILE_O原创 2011-03-15 22:59:00 · 1242 阅读 · 0 评论 -
C字符串的三种遍历方式
C字符串的三种遍历方式C字符串是用char [],字符数组来表示的,对于字符串的变量通常有两种,在这里中总结一下。代码如下:#include using namespace std;void foreachStringOne(char * str){ int len = strlen(str); for (int i = 0; i原创 2011-03-19 22:22:00 · 40681 阅读 · 1 评论 -
C++读书笔记之抽象
C++读书笔记之抽象<br />抽象编程的关键在于界面的相对稳定性。但是,不变的事物是没有的,包括界面。如何使界面保持相对稳定,或者说如何设计和维护界面,便是恒久保持抽象编程质量的关键。<br />抽象类与与纯虚函数<br />抽象类:在类定义中至少声明一个纯虚函数。<br />纯虚函数:所谓纯虚函数是指被标明为不具体实现的虚函数。例如:我并不知道怎样实现virtual Account::withdrawal(),那么就不用勉强下一个定义,只要声明为纯虚函数就行了。纯虚函数一旦声明,就不用定义。纯虚函数的声原创 2011-02-28 20:57:00 · 851 阅读 · 0 评论 -
HBST = Hash-BinarySortTree
Hash-BinarySortTree在上一篇的文章中我对字符串常见的Hash函数进行了总结,在原来的代码中Hash的缓冲数组的元素是一条链表。即每个元素下“挂”的是一个单链表。我采用了设计模式中的策略模式对上次的代码进行了改造,把每个hash函数封装成一个类,这样程序更易于扩展和修改。除了对原来的代码进行重构之外,在Hash缓冲区数组中,每个元素下“挂”的不再是单链表,而是BinarySortTree(二叉排序树),本来想“挂”BalanceBinaryTree(平衡二叉树)后面考虑编程复杂度太大了,就没原创 2011-03-21 23:08:00 · 1650 阅读 · 0 评论 -
数字字符串转整型数据的4种方法
数字字符串转整型数据的4种方法<br />在项目开发中,我们经常需要把数字字符串(值在整型数据的能够表示的范围内)转换成整型数据,这里我总结C/C++中4种不同转换方式:<br />1、使用system call调用atoi()来实现。<br />2、使用system call调用sscanf()来实现。<br />3、使用C++的字符串流对象来实现。<br />4、自己手动转换。<br />Demo代码如下:<br />/* FileName: main.cpp Author: ACb0y C原创 2011-03-27 23:40:00 · 6764 阅读 · 0 评论 -
unix/linux中书中一直提到的“ourhdr.h”文件内容
/*Our own header, to be included after all standard system headers*/#ifndef __ourhdr_h #define __ourhdr_h #include /*for definition of errno */#include /*ANSI C header file*/#includ原创 2011-06-13 09:02:00 · 2978 阅读 · 0 评论 -
用g++编译生成动态连接库*.so的方法及连接
用g++编译生成动态连接库*.so的方法及连接1、动态库*.so的编译 这里我们用到4个文件,它们分别为:SoDemoTest.h、one.cpp、two.cpp、three.cpp。它们的内容如下: SoDemoTest.h#ifndef __SO_DEMO_TEST_HEADER__#define __SO_DEMO_TEST_HEADER__#include原创 2011-06-18 10:09:00 · 38059 阅读 · 2 评论 -
OCI常用函数
一. Oracle oci工具包安装: $ORACLE_HOME\BIN:执行文件和help文件 $ORACLE_HOME\OCI\INCLUDE:头文件 $ORACLE_HOME\OCI\LIB\BC: for Borlanf C++的OCI库 $ORACLE_HOME\OC转载 2011-07-16 12:49:17 · 1788 阅读 · 0 评论 -
面向对象编程VS泛型编程
面向对象编程VS泛型编程1、面向对象浅析 OOP是对data&&operation的封装,是对同类事物的抽象,跟结构化编程相比它更接近自然语言。继承使得OO具有了更强的表达能力,进一步地接近了自然语言的属性。而多态则是OO的最为巧妙和强大的地方,它催生了一系原创 2011-09-20 23:51:15 · 2427 阅读 · 0 评论 -
基于策略(policy)的类设计方法
基于策略(policy)的类设计方法通常类的功能是复杂的,而基于策略(policy)的设计方面把类的功能分离出来,变成粒度小的模块,每个模块完成不同的策略,通过不同的策略模块有序的组装从而实现整个类复杂的功能。将class分解成policies时,要遵守两条重要的准则。第一,把你的class内的“设计决定”局部化、命名、分离出来。第二,找出正交的policies,也就是彼此之间无交互左右、原创 2012-08-20 00:46:36 · 1380 阅读 · 0 评论 -
一起来学POSIX thread 之 基本概念
一起来学POSIX thread 之 基本概念1、异步(asynchronous)异步指互不干扰的事件可以独立的发生,除非事件之间存在着依赖性.生活中存在着大量的异步事件,例如你可以一边喝茶,一边烧开水。异步带来的最大复杂性就是:如果你没有同时执行多个活动,那么异步就没有任何优势可言。如果你开始了一个异步活动,然后什么也不做等待它结束,则你并没有从异步中获得任何好处。2、并发(co原创 2013-02-08 00:08:11 · 2359 阅读 · 0 评论 -
一起来学POSIX thread 之 线程利弊与选择
一起来学POSIX thread 之 线程利弊与选择1、线程的利在多处理器系统中,利用线程的并行性可以提高计算性能。一个运行在双CPU上的计算密集型多线程程序几乎可以获得传统的单线程程序两倍的性能。“几乎两倍”是基于这样的事实:创建额外的线程和执行线程间的同步会带来额外的开销。虽然线程在多处理器的系统中能带来程序性能的提高,但性能的提高并不和处理器的个数成正比,而是和线程的并行原创 2013-02-08 22:26:05 · 2404 阅读 · 0 评论 -
一起来学POSIX thread 之 结构概览、基本数据类型和报错机制
一起来学POSIX thread 之 结构概览、基本数据类型和报错机制1、结构概览任何一个线程系统都包括三个基本要素:执行环境、调度和同步。在评估一个线程系统或者比较任意两个线程系统时,都可以从比较它们对这三个方面的支持开始。POSIX thread通过调用pthread_create来创建执行环境(线程)。创建一个线程同样也调度了该线程的执行,这将通过调用指定的“线程启动”函原创 2013-02-09 11:37:24 · 1990 阅读 · 0 评论 -
一起来学POSIX thread 之 线程的创建和基本操作接口
一起来学POSIX thread 之 线程的创建和基本操作接口1、线程的创建我们之前提到了POSIX thread的三个基本核心要输:执行环境、调度、同步。在这里我们首先介绍一下执行环境(Unix环境下)如何创建,POSIX thread提供了pthread_create接口用来创建线程。pthread_create的原型如下:int pthread_create(pthread_t原创 2013-02-10 23:46:15 · 3517 阅读 · 0 评论 -
一起来学POSIX thread 之 不变量、临界区、谓词
一起来学POSIX thread 之 不变量、临界区、谓词1、不变量(invariant)所谓的不变量是由程序作出的假设,特别是有关变量组间关系的假设。当编写队列包时,你需要为每一个队列指定一个队列头指针,指向队列的第一个元素。每一个数据元素也包含指向下一个元素的指针。重要的并不完全是数据,程序还要依赖于数据之间的关系。例如,队列或者为空,或者包含一个指向队首元素的指针。数据元素包含的指针原创 2013-02-12 21:11:33 · 2493 阅读 · 0 评论 -
一起来学POSIX thread 之 线程状态
一起来学POSIX thread 之 线程状态1、线程的四种基本状态的转换在OS中线程作为最基本的调度单元,它存在着四种基本状态,各个状态的转化情况如下图。四种状态的含义如下:1)就绪状态:线程能够运行,但在等待可用的处理器。可能刚刚启动,或刚刚从阻塞中恢复,或者从运行状态中被其他线程抢占从运行状态转变为就绪状态。2)运行状态:线程正在运行。在多处理器系统中,可原创 2013-02-11 22:02:19 · 1287 阅读 · 0 评论 -
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器最近买了王爽的汇编语言和Linux内核完全注释,准备开始好好学习一下汇编语言,并看看早期的Linux(0.11版本)源代码实现。之前舍友面试TX是被问过memcpy什么时候不能用,这种问题如何解决?答:当dest,src都指向同一个数组且dest>src,那么当n大于abs(dest > src),则这个时候原创 2013-05-18 11:21:27 · 3546 阅读 · 0 评论 -
适配器模式
适配器模式<br /> 适配器模式(Apater)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。<br /> 适配器模式主要解决什么问题呢?<br /> 答:简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。<br /> 系统的数据和行为都正确,但接口不符合时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用原创 2010-12-19 20:18:00 · 994 阅读 · 0 评论 -
开放-封闭原则
开放-封闭原则<br /> 软件设计的实体(类、模块、函数等等)应该可以扩展,但是不可以修改。就是说对于扩展是开放的,(open for extension), 对于更改是封闭的(closed for modification)<br /> 无论是模块是多么的‘封闭’,都会存在一些无法对之封闭的变化,既然不可能完全封闭,设计人员必须对于他设计的模块应该对那种变化进行封闭做出选择。作为一名优秀的软件设计者,要能预测出最有可能发生的变化种类,然后构造抽象来隔离哪些变化。<br /> 变化原创 2010-12-15 15:32:00 · 822 阅读 · 0 评论 -
装饰模式
装饰模式 动态地给一个对象添加一些额外的职责,就增加工能来说,装饰模式比生成子类更为灵活。Component是定义一个对象接口,可以这些对象动态添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。至于ConcreteDecorator就是具体的装饰对象起到给Component添加职责的功能。UM原创 2010-12-15 20:29:00 · 957 阅读 · 0 评论 -
工厂方法模式(Factory Method)
/* */#include using namespace std;class LeiFeng{public: virtual void Sweep() { cout原创 2010-12-15 22:46:00 · 884 阅读 · 0 评论 -
简单工厂VS工厂方法
简单工厂VS工厂方法<br /> 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于一个客服端来说,去除了于具体产品的依赖,但是如果要加一个新的类来完成新的功能,我们是一定需要给运算工厂类的方法里加"case"的分支条件的,而这就修改了原来的类,从而违背了开放-封闭原则。<br /> 对于变化的需求,工厂方法只需要增加相关的类和相应的工厂类就可以了,这样整个工厂和产品体系其实都没有修改的变化,而只是扩展了变化,这就完全符合了开放-封闭原则。<b原创 2010-12-16 10:25:00 · 777 阅读 · 0 评论 -
策略模式(Strategy)
策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式的结构图如下:策略模式剖析: 策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于抽象出这些算法的公共功能。 策略模式的优点是简化了单元测试,因为每个算法原创 2010-12-15 17:03:00 · 955 阅读 · 0 评论 -
技术与艺术的结合
技术与艺术的结合 编程是一门技术,更加是一门艺术,不能满足于写完代码运行结果正确就算完事,时常考虑如何更加简练,更加容易维护,容易扩展和复用,只有这样才可以真正得到提高。写出优雅的代码是一种很爽的事情。原创 2010-12-15 19:04:00 · 935 阅读 · 0 评论 -
代理模式-为别人做嫁衣
代理模式 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。Subject类定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。UML图如下:C++实现代码如下:/* Author: ACb0y Date: 2010年12月15日18:32:26 Model: Decorator(装饰模式) */#include #include using namespace std;//抽原创 2010-12-15 21:57:00 · 1173 阅读 · 0 评论 -
模板方法模式
模板方法模式<br /> 定义了一个操作中的算法的骨架,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。<br /> 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但某个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法来处理。<br /> <br />UML图如下:<br /><br /> <br />C++实现代码如下:<br /> <br />/* Author: ACb0y Date: 2010年12月16原创 2010-12-16 12:17:00 · 886 阅读 · 0 评论
分享