vector容器:capacity和reserve成员

      为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些。
vector容器预留了这些额外的存储区,用于存放新添加的元素。于是,不必为每个新元素重新
分配容器。所分配的额外内存容量的确切数目因库的实现不同而不同。比起每添加一个新元素就
必须重新分配一次容器,这个分配策略带来显著的效率。事实上,其性能非常好,因此在实际应
用中 ,比起list和deque容器,vector的增长效率通常会更高。
      vector容器处理内存分配的细节是其实现的一部分。然而,该实现部分是由vector的接
口支持的。vector类提供了两个成员函数:capacity和reserve,使程序员可与vector容器
内存分配的实现部分交互工作。capacity操作获取在容器需要分配更多的存储空间之前能够存
储的元素总数,而reserve操作则告诉vector容器应该预留多少个元素的存储空间。
      弄清楚容器的capacity和size的区别非常重要。size指容器当前拥有的元素个数,而capacity
则指容器在必须分配新存储空间之前可以存储的元素总数。为了说明size和capacity的交互作用,
考虑下面的程序:
vector<int> ivec;
cout << "ivec:size:" <<  ivec.size()
       << "capacity:"  <<  ivec.capacity() << endl;

for(vector<int>::size_type ix = 0; ix != 24; ++ix)
      ivec.push_back(ix);

cout << "ivec:size:" <<  ivec.size()
       << "capacity:"  <<  ivec.capacity() << endl;

在我们的系统上运行程序时,得到以下输出结果:
ivec:size: 0 capacity: 0
ivec:size: 24 capacity: 32

由此可见,空vector容器的size是0,而标准库显然将其capacity也设置为0.当程序员在
vector中插入元素时,容器的size就是所添加的元素个数,而其capacity则必须至少等于
size,但通常比size值更大。
现在,可如下预留额外的存储空间:
ivec.reserve(50);

cout << "ivec:size: " << ivec.size()
       << " capacity: " << ivec.capacity() << endl;
正如下面的输出结果所示,该操作只改变了容器的capacity,而其size不变:
ivec:size: 24 capacity:50

reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

posted on 2012-03-18 17:15 天涯原来不远 阅读(410) 评论(0)  编辑 收藏 引用 所属分类: C++ primer读书笔记


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论