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
}
推荐阅读
-
php中用’,'和用’.'的区别
-
[转载] spring aop 环绕通知around和其他通知的区别
-
荣耀magicbook14和magicbook15有什么区别 荣耀magicbook14和15的区别对比
-
块级作用域和var,let,const的区别
-
电子商务系统中 order表中的 order_id 和order_sn的区别
-
Oracle中的Char与Varchar的区别和实例
-
产品运营和产品经理的区别哪个好(产品运营面试问题)
-
如何查询中where和having的区别
-
MySQL null与not null和null与空值''''的区别详解
-
SQL SERVER中强制类型转换cast和convert的区别详解