Essential C++学习记录&笔记整理11(使用局部静态对象)

使用局部静态对象

用处之一是我们想在计算上省事,已经计算过的就不要再重新计算一遍了。

  • 在此我说明一点,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有内存自动管理机制(后面具体说)

发布了18 篇原创文章 · 获赞 1 · 访问量 241

猜你喜欢

转载自blog.csdn.net/weixin_45910408/article/details/105464083