博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vector扩容原理
阅读量:2384 次
发布时间:2019-05-10

本文共 1299 字,大约阅读时间需要 4 分钟。

转载原文地址:

关于vector,始终记住它必须使用的连续空间的一片内存:

在push_back的过程中,如果采用的方式是:

vector<int>v;

v.push_back(1);

 std::vector<int>::iterator iter1 = v.begin();

 v.push_back(2);

  v.push_back(3);

  v.push_back(4);

  v.push_back(5);

一开始没有设定好vector的大小,每来一个元素,就意味着会重新开辟空间,拷贝元素,这样不仅仅时间复杂度上很高。而且在重新开辟空间之后,原来的指向第一个元素的迭代器,也就是那个指针无法使用了。

这时reserve函数的作用就体现出来了,如果一开始预留的空间足够大,也就是capacity足够使用,那么在这个过程中,不用重新开辟空间,这样原来的迭代器还可以使用,这就是reserve的作用。

所以

避免内存重新配置的方法(尽量避免迭代器的失效)

可以使用Reserve()保留适当容量
       在创建容器后,第一时间为容器分配足够大的空间,避免重新分配内存。

    std::vector<int> v;//create an empty vector

    v.reserve(80);// reserve memory for 80 elements

这样在pushback的过程中,在不超过capacity之前,都不需要重新开辟空间,迭代器都不会失效。

同时也可以使用resize的方法为接下来的数据预留空间,只不过使用resize会使得capacity变得比当前的size更大。

下面说一下关于reserve和resize之间的区别:

在前面如果说使用reserve(10)

将容器的大小设置成10

那么之后每次push_back的过程中,在数量小于10的情况下,不会去重新开辟内存空间,然后进行数据的拷贝等等操作。

减少内存拷贝的复杂,和迭代器的失效等问题

如果说设置成resize,此时空间size为10,且capacity为10,并且里面被填充上了0,

即使之后push_back(1),这时因为capacity已经满了,此时还是需要重新开辟内存空间,之前的迭代器失效

那么此时设置resize的目的在哪呢?因为此时再次开辟空间的时候,因为有一个基数10在那,所以在进行空间开辟的时候,之间去另一个内存空间处,开辟出15大小的capacity。这样在接着进行push_back的过程中,就可以减少空间的开辟次数。

reserve和resize之间的区别:

1.reserve是开辟一段空的空间,push_back的过程中直接往里面插入数据,设置的大小就是capacity的大小

2.resize是开辟一段空间,但是全部填充元素0,push_back是在后面接着添加,但是不可避免的是,第一步就要重新开辟空间,而resize的初始值的意义只是有一个基数在那,使得capacity无论是以1.5还是2倍都会减少内存开辟的次数

共同点:

都可以用来一开始的空间预留,减少内存开辟的次数,和迭代器失效的次数。

 

 

你可能感兴趣的文章
css pie.htc使用总结
查看>>
python包含中文字符串长度
查看>>
sysbench 0.5 性能测试工具使用手册
查看>>
通过telnet连接查看memcache服务器
查看>>
django不用在数据库中创建新的user表而使用它的后台管理功能
查看>>
php array_unshift()修改数组key
查看>>
mysql性能优化-查询(Query)优化-2
查看>>
MySQL分区表的使用
查看>>
MongoDB 地理位置索引的实现原理
查看>>
MongoDB与MySQL的插入、查询性能测试
查看>>
深入理解OAuth2.0协议
查看>>
https原理:证书传递、验证和数据加密、解密过程解析
查看>>
MySQL在大型网站的应用架构演变
查看>>
sphinx教程1__mysql sphinx引擎插件式热安装
查看>>
sphinx教程2__安装、配置和使用
查看>>
ttserver 缓存使用和过期设置
查看>>
php pconnect 长连接原理
查看>>
php memcached使用中的坑
查看>>
php变量引用和计数_refcount_gc和is_ref_gc
查看>>
windows环境下php和Php扩展编译,扩展dll文件编译
查看>>