[c++]海量数据运行时提高程序运行效率、降低内存占用的方法

降低内存的占用

1.慎用erase()
昨天我运行了一个数据,在对字符串的处理时使用了迭代器来对string对象进行遍历,并用string.erase()进行字符串的裁剪。这种办法对于少量数据来说是完全没问题的,但是一到大量数据,就会提示内存不足,甚至电脑性能不高的话,主板会被烧坏。(别问我怎么知道的o( ̄︶ ̄)o)

出现这种情况的原因是erase对字符串(数组同理)进行擦除后,迭代器指向的是被删除的元素的下一个,而被删除的元素虽然在字符串中消失了,但是它的地址没有被释放掉,出现了野指针和内存泄漏。(自己的拙见,欢迎指导)

虽然已经找到了效率更高的办法可以不用erase,其实就是直接用find,substr就行。但是经过昨天对迭代器进行大量的研究之后,找到了以上情况的解决方案:判断迭代器所指的位置是否是字符串的开头,若不是,迭代器前移一位。

以下面的函数为例,我想去除字符串中的‘\”‘,注意:它是一个转义字符,表示双引号的一半。

原代码:

void charErase(string &str)
{
	string::iterator it;
	for (it = str.begin();it!=str.end();it++)
	{
		if(*it == '\"' )
		{
			it = str.erase(it);
			if(it == str.end())
				break;
		}
	}
}

加个判定条件:

if(it!=str.begin())
{
	 it--;
	 continue;
}

改进后的完整代码:

void charErase(string &str)
{
	string::iterator it;
	for (it = str.begin();it!=str.end();it++)
	{
		if(*it == '\"' )
		{

			it = str.erase(it);
            if(it!=str.begin())
            {
				 it--;
				 continue;
			}
			if(it == str.end())
				break;
		}
	}
}

还是不推荐用,尤其是对于处理的字符串不算长,用find和substr的效率比迭代器高。

2.释放指针后还要将指针置为空
若不置为空,那个地址还是占用着的。

free(p);
p = NULL;

3.少用公共变量,若必须用,也要及时释放
如数组vector,作为局部变量时会自动释放空间,但若作为公共变量,就会一直占用内存空间直至程序运行结束。有时候,我们虽然将其设为公共变量,但也不代表其从始至终一直有用。因此,可以选在在析构函数中释放数组的空间。

vector<数组中元素的类型>().swap(数组名);

4.不要新建多余的变量,尤其是数组等很占空间的
(1)如读文件,读一遍能解决就不要让它读两遍,费空间费时间。引申而得,我们平时在写完代码时候,要理几遍逻辑,有时虽然功能实现了,但是却做了很多无用的工作。
(2)类内定义的属性在函数中直接赋值即可,不必要在函数中新建一个相同类型的对象,再传给类内属性。这样会占用双倍空间。对于大数据量非常不友好。当然前提是该方法是类内的方法或者函数参数中有类对象。
5.多用地址传递,少用值传递。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值