C++程序设计教程--读书笔记 第六章 性能

第六章
 
一、知识点
1、当既要用函数调用来体现其结构化和可读性,又要使效率尽可能地高。解决办法就是将这种小函数声明为内联(inline)。(P198)
inline bool isnumber(char);
 
2、对函数的内联声明必须在调用之前。因为内联函数的代码在程序运行时是直接嵌在调用处执行的,它不影响链接,只在编译时确定运行代码。(P199)
 
3、内联函数体应该尽可能小,且要结构简单,这样嵌入的代码才不会影响调用函数的主体结构。所以内联函数中,不能含有复杂的结构控制语句,如switch和while。如果内联函数有这些语句,则编译将无视内联声明,只是视同普通函数那样产生调用代码。当然递归函数属于结构复杂的函数,也不能用来做内联函数。(P199)
 
4、由于递归在C++中是使用栈机制来实现的,没深入一层,都要占去一块栈数据区域,对于嵌套层数深的一些算法,递归会力不从心。(P207)
 
5、数值计算中逼近的算法一般表示为下列的模型:(P210)

6、C++计算某个字符串中的字符数可以如下计算:(P216)
#include <algorithm>
string s;
int sc1 = count(s.begin(), s.end(), '1');
这段代码就是计算字符串s中1出现的次数。
 
7、算法库中有一个集合差运算set_difference,这个函数要求两个集合容器都是已经排好序的。如下:
string s, t, u;
set_difference(s.begin(), s.end(), t.begin(), t.end(), back_inserter(u));
set_difference()的参数为三个集合,表示对两个集合进行差运算,其结果放入另一个集合。其中两个源集合,描述集合的首尾区间;一个结果集合,描述该容器的起点。back_inserter()称为插入子,它是一种迭代子,表示对参数的最后位置进行插入操作,而且返回的值仍然是最后位置。所以back_inserter对容器的操作,就是不断地在容器尾部增加新元素,然后总是指向尾部位置,充当着一个有足够空间存放结果的集合起始位置。例如:对“computer” 和“program”运算后结果就是“cetu”。(P218)
 
8、对于下列语句:
t.find(s[i]) == string::npos;
t.find是使用的strig的find操作,查看t字符串中是否含有s[i]这个字符,结果与string::npos进行比较,npos在string类中定义,表示搜索不到。如果搜索成功,则返回的是string对象中某个找到的位置。(P218)
 
9、对于reserve操作:(P220)
vector<string> abc;
abc.reserve(1100);
reserve不会改变向量中实际有的元素数,也就是说,size的值不变。reserve可以控制向量既不浪费太多空间,又使插入效率提高,还能应付元素个数不确切的复杂局面。
 
posted on 2012-05-01 09:55  谷堆旁边  阅读(210)  评论(0编辑  收藏  举报