读书人

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

发布时间: 2012-03-28 15:40:03 作者: rapoo

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内部的数据必须是连续的。

读书人网 >C++

热点推荐