摘要: 在看侯捷STL源码剖析时,看到power函数时,有点犯晕。感觉和在其他算法书上看到的不太一样,怎么也理解不了,依稀记得编程之美上有相关问题的讨论。然后google了下,找到下面这篇文章:http://blog.csdn.net/ariesjzj/article/details/6413258才突然对... 阅读全文
posted @ 2012-07-17 10:52 ziyoudefeng 阅读(1115) 评论(2) 推荐(0) 编辑
摘要: 求整数的二进制表示中1的个数,最直接的方式是求出其二进制表示,再计算出二进制表示中1的个数。但是这种方法的效率较低。因为我们只需要统计二进制表示中1的个数,所以没有必要将整数先转化为二进制,可以在对整数处理的过程中计数。整数转化为二进制,除了直接除以2以外,位操作的右移一位可以实现同样的功能。右移过程中会将最后一们直接丢弃,因此在右移操作之前需要先判断最后一们是否为1,使用“与”操作可以实现。例如如果n的最后一样是1,那么a & 0x01 = 1,否则a & 0x01 = 0。由此可以写出实现代码: 1 #include <stdio.h> 2 3 int main 阅读全文
posted @ 2012-04-24 10:24 ziyoudefeng 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 以下文字摘抄自C++程序设计语言中文版P326 考虑下面的类定义: 1 class X { 2 public: 3 X( int s ) { p = new int[s]; init(); } 4 ~X() { delete[] p; } 5 6 private: 7 int* p; 8 void init(); 9 10 } 这个类定义存在的问题是:它有可能导致“存储流失”。如果init()抛出异常,那么申请到的存储就不会被释放,因为有关对象并没有构造完成,对它不会调用析构函数。一种安全的变形是1 class Z {2 p... 阅读全文
posted @ 2012-04-22 20:40 ziyoudefeng 阅读(309) 评论(2) 推荐(0) 编辑
摘要: 对这里实现String中作者没写的四个函数// 这两个是成员函数mString&operator+=(constmString&);mString&operator+=(constchar*);// 这两个是非成员函数mStringoperator+(constmString&,constmString&);mStringoperator+(constmString&,constchar*);的具体实现不是很有想法。问题是:1、 前两个类成员函数返回的是引用,而这里String的具体实现是用的char,根据作者写的代码,自己感觉这里肯定会修改原S 阅读全文
posted @ 2012-04-19 20:58 ziyoudefeng 阅读(523) 评论(6) 推荐(0) 编辑
摘要: 1 安装和初始化 配置全局用户名和电子邮件地址prompt> git config --global user.name "Your name"prompt> git config --global user.email "you@example.com" 为特定版本库配置用户名和电子邮件地址prompt> cd /path/to/repoprompt> git config user.name "Your name"prompt> git config user.email "you@exam 阅读全文
posted @ 2012-04-19 09:44 ziyoudefeng 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 1、关于普通char如何选择的问题是由实现决定的(C.1, C.3.4)。C++提供了另外两个类型,它们都确切地回答了这个问题:signed char保存的值是-128~127,而unsigned char保存的值是0~255。P662、让常用的和局部的名字比较短,让不常用的和全局的名字比较长。P773、如果所用的内部类型表示某种可能变化的值,请用typedef为它定义一个有意义的名字;4.9.7节 P77 例如:typedef int int32;4、用typedef为类型定义同义词,用枚举或类去定义新类型。P775、几个忠告 [12] 避免有关证书大小的不必要假设 [13] 避免有关... 阅读全文
posted @ 2012-04-17 21:54 ziyoudefeng 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 1、一般来说,将一个名字空间中的所有名字统统倾倒进全局名字空间里,并不是一种好的做法。P412、迭代器和I/O P53 要做出一个ostream_iterator,我们需要描述被使用的将是哪个流,还要描述写入其中的对象的类型。例如,我们可以定义一个引用了标准输出流cout的迭代器:ostream_iterator<string> oo(cout); 一个istream_iterator就是某种东西,它使我们可以像从容器独处一样从输入流中读出:istream_iterator<string> ii(cin);举例:P54 1 #include "stdafx.h 阅读全文
posted @ 2012-04-17 21:39 ziyoudefeng 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 1、虚函数 P33 即使调用者并不知道对象的大小以及它的数据布局,位于vtbl里的函数也使对象能正确地使用。调用者需要知道的所有东西就是Stack的那个vtbl的位置,以及对各个虚函数应该使用的下标。这种虚函数调用机制的效率可以做得基本上与“正常函数调用”机制相同。其空间开销是带有虚函数的类的每个对象里包含一个指针,而每个这样的类需要有一个vtbl。2、模板是一种编译时的机制,因此,与“手工编写的代码”相比,它们的使用并不引起任何额外的运行时开销。P373、学习一种语言的工作就应该集中于把我对该语言而言固有的和自然的风格--而不是去理解该语言的所有语言特征的细枝末节。P39 在实践性的... 阅读全文
posted @ 2012-04-17 21:27 ziyoudefeng 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 1、在C++的设计中,极力避免了那些即使不用也会带来运行时间或者空间额外开销的特征。例如:要求必须在每个对象里存储某种“簿记信息”的结构被拒绝了。所以,如果你定义了一种由两个16位的量组成的结构,它将能放进一个32位的寄存器里。P72、模板功能的设计,从根本上说,是为了支持静态类型的容器(如表、向量和映射),以及优雅有效地使用这些容器(通用型程序设计)。P93、给C程序员的建议 P13 [1] 在C++里几乎不需要用宏。用const或enum定义明显的常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。 [2] 不要在你.. 阅读全文
posted @ 2012-04-17 21:11 ziyoudefeng 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 题目: 不使用/,%,+和*,如何判断一个数能否被3整除解答: 关键提示: 如果n的二进制末位为0,那么n和n>>1同时被3整除或者不整除 如果n的二进制末位为1,那么n和(n>>1)-1同时被3整除或者不整除 1 bool IsTimesOf3(int n) 2 { 3 int lastPosition; 4 if (n < 0) 5 n = - n; 6 while (n > 0) 7 { 8 lastPosition = n & 1; // 0 or 1 9 n ... 阅读全文
posted @ 2012-04-15 00:17 ziyoudefeng 阅读(1091) 评论(0) 推荐(1) 编辑