艾莉亚的猫 Time is limited, To be a better man

C++单例模式的简单实现

将Singleton类的构造函数定义为private,这样就不能实例化为一个对象(抽象类),用户访问唯一实例的方法只有通过getInstance()成员函数。

加入Garbo做为Singleton的内嵌类,程序运行结束时,系统会调用Singleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。

/*
 * Copyright (c) 2016 xxxx Inc, All rights reserved.
 * Created: 2016-02-21
 */
#include <iostream>

class Singleton{

class Garbo{
public:
	Garbo(){std::cout << "Garbo" << std::endl;}
	~Garbo(){
		if(Singleton::m_instance != NULL)
		{
			std::cout << "delete m_instance" << std::endl;
			delete m_instance;
		}
	}
};

public:
	static Singleton *getInstance()
	{
		if(m_instance == NULL){
			std::cout << "m_instance = new Singleton();" <<std::endl;
			m_instance = new Singleton();
		}
	}

private:
	Singleton(){}

private:
	static Singleton *m_instance;
	static Garbo m_garbo;
};

Singleton *Singleton::m_instance = NULL;

int main()
{
	std::cout << "getInstance first" << std::endl;
	Singleton *p = Singleton::getInstance();
	std::cout << "address: " << static_cast<const void *>(p) << std::endl;

	std::cout << "getInstance second" << std::endl;
	Singleton *q = Singleton::getInstance();
	std::cout << "address: " << static_cast<const void *>(q) << std::endl;

	return 0;
}

快速排序

快速排序由 C.A.R.Hoare(东尼霍尔,Charles Antony Richard Hoare)在1960年提出,之后又有许多人做了进一步的优化。如果你对快速排序感兴趣可以去看看东尼霍尔1962年在Computer Journal发表的论文“Quicksort”以及《算法导论》的第七章,东尼霍尔在计算机领域的贡献还有很多很多,他在1980年获得了图灵奖。

高快省的排序算法

假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:

3 1 2 5 4 6 9 7 10 8

在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗?

故乡

我现在坐在群山之巅

我把头埋在双膝之间

感到风像时光的水流

漫过我的脊梁

河流轰鸣,道路回转

现在我要独自一人

任群山的波涛把我充满

任大地重新向我涌来

今天我又穿过了一个村庄

这是我穿过的第十二个村庄

接下来我还要穿过一百多个村庄

而所有这些栽培着玉米、小麦、苹果、梨的村庄

放牧着牛羊的村庄

都跟我出生的村子一模一样

有一座水磨坊,有一所小学堂

晴天的早上,小学堂的钟声叮当作响

所有这一切都跟我出生的那个村子一模一样

所以你们这些所有的村子

你们都是我的故乡


作者: 阿来

谈谈C++的异常处理

C语言里面的错误处理使用不同的数值表示不同类型的错误,传统的错误处理方法存在很大缺点:其表达能力有限;状态编码与错误码难以形成统一标准,例如同样用途的程序库,不同的开发商可能采用不同的错误编码方案来标识不同类型错误;有些函数没有返回值(例如构造函数和析构函数)等等。

C++异常处理机制将异常类型化,显然一个类型比一个数字包含的信息量大得多。C++保证,如果一个异常在抛出点没有得到处理,那么它将一直被抛向上层调用者,直至main函数,指导找到一个类型匹配的异常处理器,否则调用terminate结束程序。可以看出:异常处理机制实际上是一种运行时通知机制

任何类型都可以当做异常类型,异常仅仅通过类型而不是通过值来匹配的。所以下面这段代码是OK的,只是我们一般不使用基本数据类型的对象作为异常。

try{
 if(..) throw 0;
}
catch(int){
 cerr << "exception!" << endl;
}

try{
 if(..) throw "error msg";
}
catch(const char *){
 cerr << "exception!" << endl;
}

2016年阅读书单

软技能

wireshark网络分析的艺术

Perl语言入门

深入理解Nginx(第2版)

重构

你不可不知的关系数据库理论