首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

STL的源代码小弟我懒得看,vector如何实现自小弟我增长

2012-03-28 
STL的源代码我懒得看,vector怎么实现自我增长?既然是可变长度,数据一定存储在堆中。在堆中的数据是连续的还

STL的源代码我懒得看,vector怎么实现自我增长?
既然是可变长度,数据一定存储在堆中。在堆中的数据是连续的还是链式的呢?若是前者,vector <> ::operator[]速度快,vector <> ::pubsh_back()慢
若是后者,则相反?


对于数组,我很容易知道每一项的内存地址,对于vector比如vector <int>   vec(10);
...........
怎么得到vec[3]的内存地址呢?


作为一个类,数据在堆中,性能一定比数组差不少吧??

[解决办法]
连续的。

> > 数据在堆中,性能一定比数组差不少吧??
数据在堆中和数组并不矛盾。
[解决办法]
为什么在堆中效率就差呢?

VECTOR分配的是一块连续空间,当这块空间不够的时候,会分配一块更大的,然后把数据搬过去。

源码中有这句:
size_type _N = size() + (_M < size() ? size() : _M
如果增加的空间_M大于原有空间_N则分配_N+_M,否则空间加一倍增长
[解决办法]
内部是连续的,如果要增加,就申请新的连续空间,将数据拷贝过去.
通过预先分配过剩的空间,可以减少申请空间的次数.

效率应该没什么分别,或者cpu硬件上会缓存一下,但这个层次就超出语法的范畴了.

[解决办法]
在堆中的数据是连续的还是链式的呢?
---------------------------------------------
vector中数据在内存中一定是连续的,这点与内置数组相同。
最开始,标准对这一点没有要求,但是随着人们对“vector与数组互换”需求的增加,标准明确规定:vector内部的数据必须是连续的。

热点排行