欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

reserve和resize的区别

程序员文章站 2022-03-21 19:49:24
...

reserve和resize的区别

1:存储空间重分配的问题:
我们知道存储空间分配的问题起源于容器对象的动态创建和连续存储的特性;因此只有连续存储的容器才可能需要运行时的存储空间分配;
典型就是vector,其他连续存储容器也会部分地需要存储空间冲分配;
第一种:如vector,其元素保存在连续的存储的空间上,当向该vector中插入一个新元素时,必须保持新的容器仍然满足元素连续存储的条件;这时候就要重新分配存储空间,平且把所有的元素都拷贝新开辟的空间里,然后释放原来的存储空间。
第二种:vector当前预留容量足够带插入的新元素,不需要进行存储空间的重分配。
2:存储空间重分配带来巨大的开销那么如何解决内存重分配的问题呢?
顺序容器vector和string都可以用reverse()和resize()来预留空间或者是调整他们的大小,前面迭代器我们知道reverse()用来保留容量,而resize()用来调整容器大小(size,有效元素的个数),而且有的时候也会调整容器的容量。
 

 

reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。

resize 是改变容器的大小,且在创建对象,因此,调用这个函数后,就可以引用容器内的对象了。

void test 01()
{
    int num = 0;
	int *address = NULL;
	vector<int> v;
	for(int i=0; i < 10000000 ; i++)
    {
	    v.push_back(i);
		if(address != &(v[0]))
		{
		    address = &(v[0]);
			num += 1;
		}	
	}
	cout<<"num:"<<num<<endl; //30
}

运行程序发现,vector出现了30次扩容,每次都要内存拷贝。内存比较大,耗时。

void test 01()
{
    int num = 0;
	int *address = NULL;
	vector<int> v;
	v.reserve(10000000); //如果知道这个容器大概存储的元素个数,可以提前预留
	for(int i=0; i < 10000000 ; i++)
    {
	    v.push_back(i);
		if(address != &(v[0]))
		{
		    address = &(v[0]);
			num += 1;
		}
	}
	cout<<"num:"<<num<<endl;//1
}

 

 

 

 

 

相关标签: c++