<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[nosmatch的专栏]]></title><description><![CDATA[好脑袋比不上烂键盘]]></description><link>https://blog.youkuaiyun.com/HDUTigerkin</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; HDUTigerkin]]></copyright><item><title><![CDATA[探索推荐引擎内部的秘密，第 1 部分: 推荐引擎初探]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9450083</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9450083</guid><author>HDUTigerkin</author><pubDate>Wed, 24 Jul 2013 14:29:19 +0800</pubDate><description><![CDATA[简介： 随着 Web 技术的发展，使得内容的创建和分享变得越来越容易。每天都有大量的图片、博客、视频发布到网上。信息

的极度爆炸使得人们找到他们需要的信息将变得越来越难。传统的搜索技术是一个相对简单的帮助人们找到信息的工具，也广泛的
被人们所使用，但搜索引擎并不能完全满足用户对信息发现的需求，原因一是用户很难用恰当的关键词描述自己的需求，二是基于
关键词的信息检索在很多情况下是不够的。而]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(36)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9399177</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9399177</guid><author>HDUTigerkin</author><pubDate>Sun, 21 Jul 2013 17:44:00 +0800</pubDate><description><![CDATA[条款36：绝不重新定义继承而来的non-virtual函数

class B{
public:
	void func();
	...
};
class D:public B{
public:
	...
};
在上面的简单例子中，如果有下面的调用：
D x;
B* p = new D();
D* q = new D();
p->func();
q->func();
此时上面的两个调用调用的]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(35)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9398881</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9398881</guid><author>HDUTigerkin</author><pubDate>Sun, 21 Jul 2013 17:24:10 +0800</pubDate><description><![CDATA[条款35：考虑virtual函数意外的其他选择]]></description><category></category></item><item><title><![CDATA[Effective C++读书笔记(34)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9398237</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9398237</guid><author>HDUTigerkin</author><pubDate>Sun, 21 Jul 2013 16:41:08 +0800</pubDate><description><![CDATA[条款34：区分接口继承和实现继承

在对Base class 进行public继承的时候，根据Base class中成员函数的类型我们能够得到不同的继承方式：如下：
class Shape{
public:
	virtual void draw() const = 0;
	virtual void error(const std::string& msg);
	int objectId() ]]></description><category></category></item><item><title><![CDATA[Effective C++读书笔记(33)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9397279</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9397279</guid><author>HDUTigerkin</author><pubDate>Sun, 21 Jul 2013 15:11:28 +0800</pubDate><description><![CDATA[条款33：避免遮掩继承而来的名称

对于继承的父类中的函数，如果在子类中有同名的函数，则父类中的同名函数都将被隐藏，例如：
class Base{
private:
	int x;
public:
	virtual void mf1() = 0;
	virtual void mf1(int x);
	virtual void mf2();
	void mf3();
	void mf3(dou]]></description><category></category></item><item><title><![CDATA[Effective C++读书笔记(32)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9396859</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9396859</guid><author>HDUTigerkin</author><pubDate>Sun, 21 Jul 2013 12:16:21 +0800</pubDate><description><![CDATA[条款32：确定你的public继承塑模出is-a关系

以public继承的类，其父类的所有的性质都应该使用与子类，任何需要父类的地方都应该能用子类来代替，任何子类类型

的对象也同时是父类的：

class Person{...};
class Student : public Person{...};
void eat(const Person& p);
void study(co]]></description><category></category></item><item><title><![CDATA[Effective C++读书笔记(31)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9396299</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9396299</guid><author>HDUTigerkin</author><pubDate>Sun, 21 Jul 2013 11:19:04 +0800</pubDate><description><![CDATA[条款31：将文件间的编译依赖关系降到最低

在C++中我们要将接口与实现分离开来，这样只要接口没有改变，对接口应用的客户就可以保持不变，例如:
class Person{
public:
	Person(const std::string& name, const Date& birthday,
		   const Address& addr);
	std::string name() c]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(30)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9389903</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9389903</guid><author>HDUTigerkin</author><pubDate>Sat, 20 Jul 2013 14:53:29 +0800</pubDate><description><![CDATA[条款30：透彻了解inline函数的里里外外

inline函数是直接将函数调用用函数的本体来替换，这样就免去了函数调用时候的消耗，但是由于每次对于函数的调用都

会用函数的本体来替换，因此过度的应用inline函数会对程序的代码造成膨胀，会造成指令缓冲的命中率，因此我们在应用inline
函数的时候也一定要把握好度！

看下面的例子：
class Base{
public:
	B]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(29)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9389717</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9389717</guid><author>HDUTigerkin</author><pubDate>Sat, 20 Jul 2013 12:26:29 +0800</pubDate><description><![CDATA[条款29：为“异常安全”而努力是值得的

在程序中抛出异常的时候，带有异常安全的函数会保证：
1.不泄露任何的资源
2.不允许数据被破坏
对于第一种情况可以采用资源管理类的方法来保证资源的释放，我们的函数都要保证异常发生时函数的保证：
1.基本承诺，函数发生异常时，对象还能保持正常的状况，但是具体处于那种状态是不确定的
2.强烈保证，函数发生异常时，如果函数成功则完全成功，如果失败则]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(28)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9389347</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9389347</guid><author>HDUTigerkin</author><pubDate>Sat, 20 Jul 2013 11:49:37 +0800</pubDate><description><![CDATA[条款28：避免返回handle指向对象内部成分

首先handle是指reference、指针和迭代器等都可以称之为handle，因为她们都是用来取得一个对象的，返回一个handle指

向对象的内部成分主要会造成下面的两种情况：

1.增大了成员的访问权限，如下例子：
class Point{
public:
	Point(int x, int y);
	...
	void set]]></description><category></category></item><item><title><![CDATA[算法：判断两个字符串是否是变位词]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9361459</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9361459</guid><author>HDUTigerkin</author><pubDate>Wed, 17 Jul 2013 23:22:36 +0800</pubDate><description><![CDATA[题目：判断两个字符串是否是变位词
分析：所谓变位词是指的连个字符串组成的字符是相同的，但是字符的位置是可以不同的，例如：qwerte和eetrwq这两个字符串就是
变位词，如果对空间的要求不高则可以建立一个256大小的数组分别映射到ASCII的每一个字符，对前一个字符串遍历在每个字符出
现加1，后面字符串中遍历，每个字符出现减1，最后检测数组是否为空，如下：


如果对空间有要求，则我]]></description><category></category></item><item><title><![CDATA[Effective C++读书笔记(27)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9347879</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9347879</guid><author>HDUTigerkin</author><pubDate>Tue, 16 Jul 2013 23:34:54 +0800</pubDate><description><![CDATA[条款27：尽量少做转型动作

在C++中尽量的少用类型的转化，只要有类型转化的地方就是有可能会出现问题的地方，在C++中有四种强制类型转化，

如下：

1、static_cast
用法：static_cast(expression)
该运算符把expression转换为type-id类型，但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法：
①用于类层次结构中基类和子]]></description><category></category></item><item><title><![CDATA[算法：编写算法移除一个字符串中重复的字符]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9347767</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9347767</guid><author>HDUTigerkin</author><pubDate>Tue, 16 Jul 2013 23:06:12 +0800</pubDate><description><![CDATA[题目：设计算法并写出代码移除字符串中重复的字符，不能使用额外的缓存空间。注意：可以使用额外的一个或两个变量，但不允许
额外再开一个数组拷贝。
分析：方法有很多种，这里主要是对字符串中的每个字符与它前面出现过的所有字符进行比较，如果前面出现过就把这个字符删除掉
代码如下：





从上面的代码可以看出算法的时间复杂度为o(n*n);
这里要求的是不能申请额外的空间，否则可以申请]]></description><category></category></item><item><title><![CDATA[Effective C++读书笔记(26)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9338531</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9338531</guid><author>HDUTigerkin</author><pubDate>Tue, 16 Jul 2013 08:20:45 +0800</pubDate><description><![CDATA[条款26：尽可能延后变量定义式的出现时间

当你定义一个变量的时候就要保证这个变量能够在程序中使用到，不要定义无意义的变量，这样就要求我们最好是在变量使用

到的时候才做定义，因为如果一个变量定义了却乜有使用可能会造成效率上的降低，毕竟很多变量的构建是要调用对应的构造函数
和析构函数的，考虑下面的例子：


std::string setName(std::string& name]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(25)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9338525</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9338525</guid><author>HDUTigerkin</author><pubDate>Tue, 16 Jul 2013 07:53:11 +0800</pubDate><description><![CDATA[条款25：考虑写出一个不抛出任何异常的swap函数]]></description><category></category></item><item><title><![CDATA[算法：反转一个C风格的字符串]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9336963</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9336963</guid><author>HDUTigerkin</author><pubDate>Mon, 15 Jul 2013 22:58:20 +0800</pubDate><description><![CDATA[分析：C风格的字符串是以'\0'结尾的字符串，例如"abcdefg"的长度是其实为"abcdefg\0",长度为8；]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(24)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9324927</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9324927</guid><author>HDUTigerkin</author><pubDate>Sun, 14 Jul 2013 22:01:09 +0800</pubDate><description><![CDATA[条款24：若所有参数皆需要类型转换，请为此采用non-member函数

考虑一个有理数的类：
class Ration{
public:
	Ration(int numerator = 0, int denominator = 1);
	int numerator() const;
	int denominator() const;
private:
	int numerator;
	in]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(23)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9323775</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9323775</guid><author>HDUTigerkin</author><pubDate>Sun, 14 Jul 2013 15:59:04 +0800</pubDate><description><![CDATA[条款23：宁以non-member、non-friend替代member函数]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(22)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9323719</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9323719</guid><author>HDUTigerkin</author><pubDate>Sun, 14 Jul 2013 12:33:36 +0800</pubDate><description><![CDATA[条款22：将成员变量声明为private

对于C++而已，封装型是其三大特征之一，之所以封装型是如此的重要，是因为封装型能为接口的使用者提供透明的服务，

内部的任何改变对其客户使用者来说都是透明的，都不需要做任何的改变，将class中的成员变量设为private的并且为成员变量设定
对应的接口函数，这样外面的调用者只能通过接口函数来使用成员变量，对成员变量的任何改动只要接口不变都是可]]></description><category></category></item><item><title><![CDATA[Effective C++ 读书笔记(21)]]></title><link>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9323517</link><guid>https://blog.youkuaiyun.com/HDUTigerkin/article/details/9323517</guid><author>HDUTigerkin</author><pubDate>Sun, 14 Jul 2013 11:42:45 +0800</pubDate><description><![CDATA[条款21：必须返回对象时别妄想返回reference

上一个条款讲解了以pass-by-reference来替代pass-by-value可以很好的增加效率，但是pass-by-reference也是不能乱用的

本条款主要讲在函数返回对象的时候不应该让他返回一个reference！上例子：

class Ration{
public:
	Ration(int numerator,i]]></description><category></category></item></channel></rss>