STL的源代码我懒得看,vector怎么实现自我增长?

飞驰的青蛙 2007-01-20 05:02:53
既然是可变长度,数据一定存储在堆中。在堆中的数据是连续的还是链式的呢?若是前者,vector<>::operator[]速度快,vector<>::pubsh_back()慢
若是后者,则相反?


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


作为一个类,数据在堆中,性能一定比数组差不少吧??
...全文
330 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingchaoyan 2010-01-17
  • 打赏
  • 举报
回复
我也觉得是这样的
内部是连续的,如果要增加,就申请新的连续空间,将数据拷贝过去.
通过预先分配过剩的空间,可以减少申请空间的次数.
FantasyNES 2007-01-21
  • 打赏
  • 举报
回复
这个问题我也懒得说
HewpKanXue 2007-01-20
  • 打赏
  • 举报
回复
连续+预留容量
OOPhaisky 2007-01-20
  • 打赏
  • 举报
回复
至于其他的容器,如deque,list,set等等,他们的内存则不是连续的(至少不是完全的连续的)。
OOPhaisky 2007-01-20
  • 打赏
  • 举报
回复
在堆中的数据是连续的还是链式的呢?
---------------------------------------------------------------------------------
vector中数据在内存中一定是连续的,这点与内置数组相同。
最开始,标准对这一点没有要求,但是随着人们对“vector与数组互换”需求的增加,标准明确规定:vector内部的数据必须是连续的。
htqx 2007-01-20
  • 打赏
  • 举报
回复
内部是连续的,如果要增加,就申请新的连续空间,将数据拷贝过去.
通过预先分配过剩的空间,可以减少申请空间的次数.

效率应该没什么分别,或者cpu硬件上会缓存一下,但这个层次就超出语法的范畴了.
v2002750 2007-01-20
  • 打赏
  • 举报
回复
为什么在堆中效率就差呢?

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

源码中有这句:
size_type _N = size() + (_M < size() ? size() : _M
如果增加的空间_M大于原有空间_N则分配_N+_M,否则空间加一倍增长
iambic 2007-01-20
  • 打赏
  • 举报
回复
连续的。

>>数据在堆中,性能一定比数组差不少吧??
数据在堆中和数组并不矛盾。

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧