设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1675|回复: 4
打印 上一主题 下一主题

关于容器的size和capacity操作的问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-4 00:06:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在C++ Primer 3E中读到一段:

#include <vector>
#include <iostream>
using namespace std;//这个是我自己加的
int main()
{
vector< int > ivec;
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
for ( int ix = 0; ix < 24; ++ix ) {
ivec.push_back( ix );
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
}
cin.get();//这个是我自己加的
}

运行结果:
ivec: size: 0 capacity: 0
ivec: size: 1 capacity: 1
ivec: size: 2 capacity: 2
ivec: size: 3 capacity: 4
ivec: size: 4 capacity: 4
ivec: size: 5 capacity: 8
ivec: size: 6 capacity: 8
ivec: size: 7 capacity: 8
ivec: size: 8 capacity: 8
ivec: size: 9 capacity: 16
ivec: size: 10 capacity: 16
ivec: size: 11 capacity: 16
ivec: size: 12 capacity: 16
ivec: size: 13 capacity: 16
ivec: size: 14 capacity: 16
ivec: size: 15 capacity: 16
ivec: size: 16 capacity: 16
ivec: size: 17 capacity: 32
ivec: size: 18 capacity: 32
ivec: size: 19 capacity: 32
ivec: size: 20 capacity: 32
ivec: size: 21 capacity: 32
ivec: size: 22 capacity: 32
ivec: size: 23 capacity: 32
ivec: size: 24 capacity: 32

此书的下文:
在Rogue Wave 实现版本下在ivec 的定义之后它的长度和容量都是0 但是在插入
第一个元素之后ivec 的容量是256 长度为1 这意味着在ivec 下一次需要增长之前我
们可以向它加入256 个元素当我们插入第256 个元素时vector 以下列方式重新自我增长
它分配双倍于当前容量的存储区把当前的值拷贝到新分配的内存中井释放原来的内存
正如稍后我们将要看到的同list 相比数据类型越大越复杂则vector 的效率也就越低

我的问题是:
1. 什么是Rogue Wave 版本?
2. 为什么在我的机器上运行的结果,capacity不是256呢?

谢谢大家的宝贵时间!
2#
发表于 2009-11-4 00:06:12 | 只看该作者
Rogue Wave 实现版本?? 没听说过...
vector当空间不够时 新分配实际大小是 原来大小的2倍...(sgl stl 版本)
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-4 00:06:13 | 只看该作者
当然开始如果为 0 ,那么是先变为1
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-4 00:06:14 | 只看该作者
以下是引用corrupt在2006-9-19 8:31:21的发言:
Rogue Wave 实现版本?? 没听说过...
vector当空间不够时 新分配实际大小是 原来大小的2倍...(sgl stl 版本)

最想了解的就是这个“原来”的大小,初始化时的容量大小一般默认的都是0吗?谢谢。
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-4 00:06:15 | 只看该作者
容器都有构造函数的啊!

explicit vector(const A& al = A());
explicit vector(size_type n, const T& v = T(), const A& al = A());
vector(const vector& x);
vector(const_iterator first, const_iterator last,
const A& al = A());

list也是如此。
由于你声明时估计只是vector<int>ivec;
那么A就取了默认的allocator<int>
也就是说typedef A allocator<int>;

那么构造函数会是第一个:explicit vector(allocator<int> a);


The first constructor specifies an empty initial controlled sequence. //所以为0
The second constructor specifies a repetition of n elements of value x.
The third constructor specifies a copy of the sequence controlled by x.
The last constructor specifies the sequence [first, last).
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 17:52 , Processed in 0.135842 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表