新微赢技术网

标题: 关于容器的size和capacity操作的问题 [打印本页]

作者: 轻松由我    时间: 2009-11-4 00:06
标题: 关于容器的size和capacity操作的问题
在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呢?

谢谢大家的宝贵时间!
作者: 晒月亮的蜻蜓    时间: 2009-11-4 00:06
Rogue Wave 实现版本?? 没听说过...
vector当空间不够时 新分配实际大小是 原来大小的2倍...(sgl stl 版本)
作者: 蓳隯Д麞帥    时间: 2009-11-4 00:06
当然开始如果为 0 ,那么是先变为1
作者: 梦的放肆    时间: 2009-11-4 00:06
以下是引用corrupt在2006-9-19 8:31:21的发言:
Rogue Wave 实现版本?? 没听说过...
vector当空间不够时 新分配实际大小是 原来大小的2倍...(sgl stl 版本)

最想了解的就是这个“原来”的大小,初始化时的容量大小一般默认的都是0吗?谢谢。
作者: 阿玛比雷    时间: 2009-11-4 00:06
容器都有构造函数的啊!

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).




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2