STL vector .resize()的困惑

v522zy 2008-10-05 09:20:59

看了一些文章,讨论.resize()/.size()和.reserve()/.capacity(),于是出于好奇,写了一个这个测试一下
源码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vector1;
for ( int i=1; i<=30; i++ )
{
vector1.resize(i);
cout<<"vector1.resize("<<i<<"): vector1.capacity()="<<vector1.capacity()
<<",vector1.size()="<<vector1.size()<<endl;
}
return 0;
}


输出如下:

vector1.resize(1): vector1.capacity()=1,vector1.size()=1
vector1.resize(2): vector1.capacity()=2,vector1.size()=2
vector1.resize(3): vector1.capacity()=3,vector1.size()=3
vector1.resize(4): vector1.capacity()=4,vector1.size()=4
vector1.resize(5): vector1.capacity()=6,vector1.size()=5
vector1.resize(6): vector1.capacity()=6,vector1.size()=6
vector1.resize(7): vector1.capacity()=9,vector1.size()=7
vector1.resize(8): vector1.capacity()=9,vector1.size()=8
vector1.resize(9): vector1.capacity()=9,vector1.size()=9
vector1.resize(10): vector1.capacity()=13,vector1.size()=10
vector1.resize(11): vector1.capacity()=13,vector1.size()=11
vector1.resize(12): vector1.capacity()=13,vector1.size()=12
vector1.resize(13): vector1.capacity()=13,vector1.size()=13
vector1.resize(14): vector1.capacity()=19,vector1.size()=14
vector1.resize(15): vector1.capacity()=19,vector1.size()=15
vector1.resize(16): vector1.capacity()=19,vector1.size()=16
vector1.resize(17): vector1.capacity()=19,vector1.size()=17
vector1.resize(18): vector1.capacity()=19,vector1.size()=18
vector1.resize(19): vector1.capacity()=19,vector1.size()=19
vector1.resize(20): vector1.capacity()=28,vector1.size()=20
vector1.resize(21): vector1.capacity()=28,vector1.size()=21
vector1.resize(22): vector1.capacity()=28,vector1.size()=22
vector1.resize(23): vector1.capacity()=28,vector1.size()=23
vector1.resize(24): vector1.capacity()=28,vector1.size()=24
vector1.resize(25): vector1.capacity()=28,vector1.size()=25
vector1.resize(26): vector1.capacity()=28,vector1.size()=26
vector1.resize(27): vector1.capacity()=28,vector1.size()=27
vector1.resize(28): vector1.capacity()=28,vector1.size()=28
vector1.resize(29): vector1.capacity()=42,vector1.size()=29
vector1.resize(30): vector1.capacity()=42,vector1.size()=30
请按任意键继续. . .



不明白啊,为什么.capacity()的返回值会呈现出这样一种变化?


...全文
1506 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
p.s. 当容器大小不够时申请更大的内存,而这个扩大的系数是统计得到的最佳数据 - 1.4倍,但是通常人们会更喜欢1.5
  • 打赏
  • 举报
回复
这里的规律不属于语言标准或编译器,而是跟库实现相关。
kkndciapp 2008-10-05
  • 打赏
  • 举报
回复
容器是动态分配的,一旦大小跟容量相等,就会到堆空间去申请更大的内存,然后把现在这块复制过去,然后释放,楼主不必太在意空间的不够,这点在stl实现里面已经做得很好了
v522zy 2008-10-05
  • 打赏
  • 举报
回复


哦,

那就是因环境而异的啊


谢谢大家
v522zy 2008-10-05
  • 打赏
  • 举报
回复

我用的是visual studio 2005


算起来的话

是1.5倍的

在一个老贴上看到:
根据C++沉思录作者后来的说法,扩展 size 为当前的 1.5 倍比较合适。 VC71带的 std::vector 就是这样实现的。

不知8是不是也这样

luxiaoxun 2008-10-05
  • 打赏
  • 举报
回复
vector1.resize(1): vector1.capacity()=1,vector1.size()=1
vector1.resize(2): vector1.capacity()=2,vector1.size()=2
vector1.resize(3): vector1.capacity()=4,vector1.size()=3
vector1.resize(4): vector1.capacity()=4,vector1.size()=4
vector1.resize(5): vector1.capacity()=8,vector1.size()=5
vector1.resize(6): vector1.capacity()=8,vector1.size()=6
vector1.resize(7): vector1.capacity()=8,vector1.size()=7
vector1.resize(8): vector1.capacity()=8,vector1.size()=8
vector1.resize(9): vector1.capacity()=16,vector1.size()=9
vector1.resize(10): vector1.capacity()=16,vector1.size()=10
vector1.resize(11): vector1.capacity()=16,vector1.size()=11
vector1.resize(12): vector1.capacity()=16,vector1.size()=12
vector1.resize(13): vector1.capacity()=16,vector1.size()=13
vector1.resize(14): vector1.capacity()=16,vector1.size()=14
vector1.resize(15): vector1.capacity()=16,vector1.size()=15
vector1.resize(16): vector1.capacity()=16,vector1.size()=16
vector1.resize(17): vector1.capacity()=32,vector1.size()=17
vector1.resize(18): vector1.capacity()=32,vector1.size()=18
vector1.resize(19): vector1.capacity()=32,vector1.size()=19
vector1.resize(20): vector1.capacity()=32,vector1.size()=20
vector1.resize(21): vector1.capacity()=32,vector1.size()=21
vector1.resize(22): vector1.capacity()=32,vector1.size()=22
vector1.resize(23): vector1.capacity()=32,vector1.size()=23
vector1.resize(24): vector1.capacity()=32,vector1.size()=24
vector1.resize(25): vector1.capacity()=32,vector1.size()=25
vector1.resize(26): vector1.capacity()=32,vector1.size()=26
vector1.resize(27): vector1.capacity()=32,vector1.size()=27
vector1.resize(28): vector1.capacity()=32,vector1.size()=28
vector1.resize(29): vector1.capacity()=32,vector1.size()=29
vector1.resize(30): vector1.capacity()=32,vector1.size()=30
请按任意键继续. . .

devC++下2倍...
e_sharp 2008-10-05
  • 打赏
  • 举报
回复
一般是2倍递增
e_sharp 2008-10-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 v522zy 的回复:]


一楼的规律

怎么我没有见过

是标准里面的吗?

还是因编译器而异啊??
[/Quote]

和具体的STL的实现有关
chlaws 2008-10-05
  • 打赏
  • 举报
回复
http://dev.csdn.net/article/37298.shtm
richbirdandy 2008-10-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 v522zy 的回复:]


一楼的规律

怎么我没有见过

是标准里面的吗?

还是因编译器而异啊??
[/Quote]
我记得是两倍
v522zy 2008-10-05
  • 打赏
  • 举报
回复


一楼的规律

怎么我没有见过

是标准里面的吗?

还是因编译器而异啊??


v522zy 2008-10-05
  • 打赏
  • 举报
回复


这样看来

确实是哦

我也正纳闷这个规律性的问题呢


谢过了

lzr4304061988012 2008-10-05
  • 打赏
  • 举报
回复
我觉得只要capacity()>=size()就好了..
kkndciapp 2008-10-05
  • 打赏
  • 举报
回复
capacity是针对size不够用的时候,一般分配为以前的1.5倍,如果size继续增大,还不够用,又是这次的1.5倍递增.

64,654

社区成员

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

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