为了使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: 0ivec: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:50reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。
resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。