- 博客(151)
- 资源 (19)
- 收藏
- 关注
转载 探索推荐引擎内部的秘密,第 1 部分: 推荐引擎初探
简介: 随着 Web 技术的发展,使得内容的创建和分享变得越来越容易。每天都有大量的图片、博客、视频发布到网上。信息 的极度爆炸使得人们找到他们需要的信息将变得越来越难。传统的搜索技术是一个相对简单的帮助人们找到信息的工具,也广泛的 被人们所使用,但搜索引擎并不能完全满足用户对信息发现的需求,原因一是用户很难用恰当的关键词描述自己的需求,二是基于 关键词的信息检索在很多情况下是不够的。而
2013-07-24 14:29:19
1047
原创 Effective C++ 读书笔记(36)
条款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(); 此时上面的两个调用调用的
2013-07-21 17:44:00
981
原创 Effective C++读书笔记(34)
条款34:区分接口继承和实现继承 在对Base class 进行public继承的时候,根据Base class中成员函数的类型我们能够得到不同的继承方式:如下: class Shape{ public: virtual void draw() const = 0; virtual void error(const std::string& msg); int objectId()
2013-07-21 16:41:08
949
原创 Effective C++读书笔记(33)
条款33:避免遮掩继承而来的名称 对于继承的父类中的函数,如果在子类中有同名的函数,则父类中的同名函数都将被隐藏,例如: class Base{ private: int x; public: virtual void mf1() = 0; virtual void mf1(int x); virtual void mf2(); void mf3(); void mf3(dou
2013-07-21 15:11:28
800
原创 Effective C++读书笔记(32)
条款32:确定你的public继承塑模出is-a关系 以public继承的类,其父类的所有的性质都应该使用与子类,任何需要父类的地方都应该能用子类来代替,任何子类类型 的对象也同时是父类的: class Person{...}; class Student : public Person{...}; void eat(const Person& p); void study(co
2013-07-21 12:16:21
919
原创 Effective C++读书笔记(31)
条款31:将文件间的编译依赖关系降到最低 在C++中我们要将接口与实现分离开来,这样只要接口没有改变,对接口应用的客户就可以保持不变,例如: class Person{ public: Person(const std::string& name, const Date& birthday, const Address& addr); std::string name() c
2013-07-21 11:19:04
787
原创 Effective C++ 读书笔记(30)
条款30:透彻了解inline函数的里里外外 inline函数是直接将函数调用用函数的本体来替换,这样就免去了函数调用时候的消耗,但是由于每次对于函数的调用都 会用函数的本体来替换,因此过度的应用inline函数会对程序的代码造成膨胀,会造成指令缓冲的命中率,因此我们在应用inline 函数的时候也一定要把握好度! 看下面的例子: class Base{ public: B
2013-07-20 14:53:29
888
原创 Effective C++ 读书笔记(29)
条款29:为“异常安全”而努力是值得的 在程序中抛出异常的时候,带有异常安全的函数会保证: 1.不泄露任何的资源 2.不允许数据被破坏 对于第一种情况可以采用资源管理类的方法来保证资源的释放,我们的函数都要保证异常发生时函数的保证: 1.基本承诺,函数发生异常时,对象还能保持正常的状况,但是具体处于那种状态是不确定的 2.强烈保证,函数发生异常时,如果函数成功则完全成功,如果失败则
2013-07-20 12:26:29
689
原创 Effective C++ 读书笔记(28)
条款28:避免返回handle指向对象内部成分 首先handle是指reference、指针和迭代器等都可以称之为handle,因为她们都是用来取得一个对象的,返回一个handle指 向对象的内部成分主要会造成下面的两种情况: 1.增大了成员的访问权限,如下例子: class Point{ public: Point(int x, int y); ... void set
2013-07-20 11:49:37
1036
原创 算法:判断两个字符串是否是变位词
题目:判断两个字符串是否是变位词 分析:所谓变位词是指的连个字符串组成的字符是相同的,但是字符的位置是可以不同的,例如:qwerte和eetrwq这两个字符串就是 变位词,如果对空间的要求不高则可以建立一个256大小的数组分别映射到ASCII的每一个字符,对前一个字符串遍历在每个字符出 现加1,后面字符串中遍历,每个字符出现减1,最后检测数组是否为空,如下: 如果对空间有要求,则我
2013-07-17 23:22:36
2202
原创 Effective C++读书笔记(27)
条款27:尽量少做转型动作 在C++中尽量的少用类型的转化,只要有类型转化的地方就是有可能会出现问题的地方,在C++中有四种强制类型转化, 如下: 1、static_cast 用法:static_cast(expression) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类和子
2013-07-16 23:34:54
764
原创 算法:编写算法移除一个字符串中重复的字符
题目:设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意:可以使用额外的一个或两个变量,但不允许 额外再开一个数组拷贝。 分析:方法有很多种,这里主要是对字符串中的每个字符与它前面出现过的所有字符进行比较,如果前面出现过就把这个字符删除掉 代码如下: 从上面的代码可以看出算法的时间复杂度为o(n*n); 这里要求的是不能申请额外的空间,否则可以申请
2013-07-16 23:06:12
1841
原创 Effective C++读书笔记(26)
条款26:尽可能延后变量定义式的出现时间 当你定义一个变量的时候就要保证这个变量能够在程序中使用到,不要定义无意义的变量,这样就要求我们最好是在变量使用 到的时候才做定义,因为如果一个变量定义了却乜有使用可能会造成效率上的降低,毕竟很多变量的构建是要调用对应的构造函数 和析构函数的,考虑下面的例子: std::string setName(std::string& name
2013-07-16 08:20:45
812
原创 算法:反转一个C风格的字符串
分析:C风格的字符串是以'\0'结尾的字符串,例如"abcdefg"的长度是其实为"abcdefg\0",长度为8;
2013-07-15 22:58:20
949
原创 Effective C++ 读书笔记(24)
条款24:若所有参数皆需要类型转换,请为此采用non-member函数 考虑一个有理数的类: class Ration{ public: Ration(int numerator = 0, int denominator = 1); int numerator() const; int denominator() const; private: int numerator; in
2013-07-14 22:01:09
823
原创 Effective C++ 读书笔记(22)
条款22:将成员变量声明为private 对于C++而已,封装型是其三大特征之一,之所以封装型是如此的重要,是因为封装型能为接口的使用者提供透明的服务, 内部的任何改变对其客户使用者来说都是透明的,都不需要做任何的改变,将class中的成员变量设为private的并且为成员变量设定 对应的接口函数,这样外面的调用者只能通过接口函数来使用成员变量,对成员变量的任何改动只要接口不变都是可
2013-07-14 12:33:36
734
原创 Effective C++ 读书笔记(21)
条款21:必须返回对象时别妄想返回reference 上一个条款讲解了以pass-by-reference来替代pass-by-value可以很好的增加效率,但是pass-by-reference也是不能乱用的 本条款主要讲在函数返回对象的时候不应该让他返回一个reference!上例子: class Ration{ public: Ration(int numerator,i
2013-07-14 11:42:45
824
原创 算法:字符串字符重复问题
题目:实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。(即只使用基本的数据结构) 分析:对于字符串的组成不确定,是ASCII码还是英语的26个字母,对于不同的组成可能有不同的处理方法,本题目可以设置一个数组 组用每个元素的真假来标记在字符串中是否出现过该元素。 情况1.字符串是由26个英文字母组成,其中大小写不敏感 情况2.字符串是由AS
2013-07-14 11:16:53
1511
原创 Effective C++ 读书笔记(20)
条款20:宁以pass-by-reference-to-const替换pass-by-value 考虑下面的例子: class People{ public: Person(); virtual ~People(); ... private: std::string name; std::string address; }; class Student:public Peopl
2013-07-13 16:57:51
663
原创 Effective C++ 读书笔记(19)
条款19:设计class犹如设计type 条款主要的是介绍在设计class的时候应该注意的问题,只要有以下几点: 1.新的type的对象应该如何被构造和析构,主要是指的新的type的构造函数和析构函数的定义 2.对象的初始化和对象的赋值有什么样的区别,主要是新type的复制构造函数和赋值函数的定义 3.新的type的对象如果被passed by value 将以为这什么? 4.什么是
2013-07-13 15:42:33
611
原创 Effective C++ 读书笔记(18)
条款18:让接口更容易的被使用,不易误用 接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂 ,让使用者不宜发生误用,例如对于一个时间类: class Date{ public: Data(int month, int day, int year){ .... } }; 在应用Date类的时候,对于D
2013-07-13 15:06:31
660
原创 Effective C++ 读书笔记(17)
条款17:以独立的语句将new的资源放入到智能指针中 考虑以下情况: int prirority(); void processWidget(std::shared_ptr pw, int priority); 我们在对processWidget函数进行调用的时候,可以采用如下形式: processWidget(std::shared_ptr pw(new widget), prior
2013-07-12 09:15:12
628
原创 Effective C++ 读书笔记(16)
条款16:当成对的使用new 和 delete时,要确保new 和 delete的格式是相同的 这个条款比较简单,但是却很容易出错,首先我们看下当我们使用new和delete的时候编译器为我们做了什么,当我们调用new 操作符的时候,编译器会首先在内存中帮我们申请一块空间,然后调用对应对象的构造函数,想对应的当我们调用delete的时候,编译 器会首先在该空间调用对应的析构函数然后再
2013-07-12 08:24:37
633
原创 Effective C++ 读书笔记(14)
条款14:在资源管理类中小心copying行为 在条款中主要的介绍了智能指针的用法,那里解决为问题是指向一个heap空间的指针的申请与释放问题,然而并非所有 的资源都是在heap中申请的,这时候智能指针就不适合了,例如对于类型为Mutex的互斥器对象,只有lock和unlock的操作,在 这里lock与unlock是成对存在的,为了防止调用lock后忘记unlock我们可以自己管理资
2013-07-11 23:22:30
852
原创 Effective C++ 读书笔记(13)
条款13:以对象来管理资源 在C++中我们经常会涉及到资源的申请与申请,一般都是由关键字new 和 delete来操作的,两者都是成对存在的,缺一不可,否 则会出现意想不到的问题,例如: class Investment{.....}; Investment* pinv = createInvestment(); 我们在使用完后要动态的释放掉pinv所指向的资源,例如在
2013-07-11 08:53:58
716
原创 Effective C++ 读书笔记(12)
条款12:复制对象时勿忘其每一个成分 C++中类会将成员都封装起来,类的copy操作只能通过赋值函数和复制构造函数,在进行对应的copy操作的时候注意要将成员 的没一个成员进行对应的复制!例如:
2013-07-10 22:14:43
551
原创 Effective C++ 读书笔记(11)
条款11:在operator=中处理“自我赋值” 自我赋值是指将对象自己赋值给自己;例如People p; ... p = p;虽然这看起来比较好笑,但是这种情况很可能会出现的,例如当你对两个指针进行赋值操作的时候,两个指针指向的对象就可能 是同一个,在C++中,由于多态的出现,类型不同的指针或者引用也可能指向同一个对象,例如: class People{...}; class
2013-07-10 10:18:48
708
原创 Effective C++ 读书笔记(10)
条款10:让操作符=返回一个reference to *this 对一些存在的操作符重载的时候,最好是要兼容这些操作符本身就有的属性,例如对于操作符=,可以实现连等的操作,例如 int a = b = c = 10;这样可以认为10先赋值给c,然后c的值又赋值给b,b的值最后赋值给a,同样的对于类中操作符=的重载也要支持 这样的操作,那么可以将operator返回操作符的左值,为了效
2013-07-10 09:31:43
993
原创 Effective C++ 读书笔记(9)
条款九:绝对不要在构造函数或者析构函数中调用virtual函数 首先上例子: class People{ public: People(); virtual void task() const = 0; .... }; People::People(){ .... task(); } class Studeng : public People{ public: virtua
2013-07-10 00:54:36
666
原创 Effective C++ 读书笔记(8)
条款八:别让异常逃离析构函数 异常判断是与C语言不同一个功能,带来方便的同时也会带来一些问题,例如: class widget{ public: .... ~widget(){} }; void doSomething(){ std::vecotr v; ..... } 在doSomething的函数结束的时候,vector中的对象会对应的调用widget类
2013-07-10 00:28:42
655
原创 Effective C++ 读书笔记(7)
条款七:为多态的基类声明virtual析构函数 任何的类都会有构造函数和析构函数,当你没有显示的定义的时候编译器会给你定义默认的构造和析构函数,普通的类 也就是不做任何类的父类的类,其对应函数的定义与其他成员函数的定义是相类似的,对于基类,由于基类的属性要被对应的子类 继承,因此也会有不同的属性!在父类中,如果存在任何的virtual虚函数,那么这个类的析构函数也最好声明为virtu
2013-07-10 00:05:19
641
原创 Effective C++ 读书笔记(6)
条款六:如果不想使用编译器自动生成的函数,就应该明确的拒绝(不要搞暧昧!) C++是一个比较复杂的语言,包含的模块比较多,我们写程序的一个原则就是不用的功能就要明确的禁止掉,这样就会防止 在意想不到的情况下出现调用,C++瞒着你在背后做了太多的事情了! 对于一个独一无二的对象,例如前面的People对象,每个人都是唯一的,因此我们不想在People类中出现copy构造函数和
2013-07-08 23:21:27
621
原创 Effective C++ 读书笔记(5)
条款五:了解C++默默编写并调用那些函数 是否处在空的类?假设定义类为class Empty{};当C++编译器处理过后会变成如下的形式: class Empty{ Empty(){} ~Empty(){} Empty& operator=(const Empty& rhs){.....} Empty(const Empty& rhs){.....} } 可以分别称为构造函数,
2013-07-08 22:51:18
567
原创 Effective C++ 读书笔记(4)
条款四:确定对象在使用前已经初始化 这一条也可以说是在成员定义的时候同时赋予一个初始的数值,有过C编程经验的人对指针定义的初始化应该不陌生,指针 定义的时候同时给予一个初始化的值,一般是为NULL,这样就不会出现野指针的情况,同时在指针空间释放的时候也注意将对应 的指针赋予一个NULL的值,这样就不会出现指针指向一个无效的地址的情况!同样在C++里面,类作为主要的自定义类型,其成员
2013-07-08 22:24:41
805
原创 Effective C++ 读书笔记(3)
条款三:尽量的使用const 条款二对const关键字进行了简单的介绍,主要是介绍了const对一些预处理定义的替换使用,本条款主要是讲const作为 一个常量修饰的一个寓意的约束,总之就是一句话:在能使用const的地方尽量使用const! 1.const对于基本内置类型的约束,主要指的是指针类型。 对于指针类型有下面两种约束的方式: const int * pi; int
2013-07-07 23:05:26
676
原创 Effective C++ 读书笔记(2)
条款二:尽量以const,enum,inline替换#define 对于条款二,可以理解为能在编译器期间做的事情不要放到预编译器中处理,预编译器是对程序编译之前的一个预先的处理,不会检查对代码最任何的检出,这样如果在编译期间发现问题,如果问题是我们自己直接造成的那可能会很快的定位,想反的如果问题在预编译期间做了一些处理,那样在编译中出现的问题可能会显示预编译中的问问题,这样对问题定位不方便,
2013-07-07 17:10:14
665
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人