使用局部静态对象
用处之一是我们想在计算上省事,已经计算过的就不要再重新计算一遍了。
- 在此我说明一点,file scope对象会打乱不同函数间的独立性,使他们难以理解,最好别老用他,虽然file scope对象不会在函数结束后被扔了。
那我想怎么保留对象的值(如果对象是个数组,就更得考虑了)
所以,咱们得使用局部静态对象 - 看个例子
const vector<int>* fibon_seq(int size)
{
static vector<int>elems;
//函数的其他代码...
return &elems;
}
瞅瞅,这里的elems被定义为函数的局部静态对象,局部静态对象的内存空间,是一直存在的,甭管什么函数调用它,它内存空间不会消失,直到程序运行结束。呜呼,所以我们在用此类对象时可以返回其地址!
这样我们就可以解决计算上省事的问题了。(不用重新计算了),但你必须有其他代码来体现,不能只定义一个局部静态对象。
- 例子中局部静态对象是vector,因我们用其自带的size()函数和push_back()函数来真正实现计算上的省事。我给你个代码段看看
//斐波那契数列的计算实现(与上例代码共通)
//如果size小于elem.size(),则跳过for循环,不必再计算,很省时间!妙!
for(int ix=elems.size();ix<size;ix++)
{
if(ix==0||ix==1)
{
elems.push_back(1);//此种情况vector里只有1
}
else
{
elems.push_back(elems[ix-1]+elems[ix-2]);
}
return &elems;
}
这段代码有些地方需要注意一下
①for循环:第一表达式是elems当前所拥有的斐波那契数列的元素,第二表达式是用户输入的想计算并显示的斐波那契数列的元素。
※②elems是被定义为空的vector,按需往里插入元素。为什么?因为我们不知道该函数里需要多大容量的vector!push_back()函数会把()里面的数值放在vector(数组)的最后头。这样我们在第二次,第三次,第N次调用该函数的时候,就会省下前面数列元素的计算,直接根据elems的元素多少计算需要的数列元素并往里插就是了(如同高楼扩楼层的意思)
③ 有了②这样的先知条件,不难理解if内的语句,没有元素或只有一个元素,我们就往里插数列的第一个或第二个元素1,else语句就是插前一个和前两个的和的元素。
④vector class有内存自动管理机制(后面具体说)