vector对象是如何增长的

C++的vector容器相当于提供了长度可变的数组。但是这个“数组”的长度是如何增长的呢?

详见C++ Primer(第五版),9.4节。

写了一个程序来测试

 1 /* vector对象是如何增长的
 2  * gcc version 4.8.1
 3  */
 4
 5 #include <iostream>
 6 #include <vector>
 7
 8 using namespace std;
 9
10 void printSizeCapacity(vector<int>& ivec)
11 {
12     cout << "size: " << ivec.size() << "\t capacity: " << ivec.capacity() << endl;
13 }
14
15 int main()
16 {
17     vector<int> ivec;
18
19     cout << "\nadd 20 elements step by step" << endl;
20     for (int i = 0; i < 20; i++) {
21         printSizeCapacity(ivec);
22         ivec.push_back(0);
23     }
24
25     cout << "\ncall reserve() to make the vector grow to 50 elements" << endl;
26     ivec.reserve(50);
27     while (ivec.size() != ivec.capacity()) {
28         ivec.push_back(0);
29     }
30     printSizeCapacity(ivec);
31
32     cout << "\nadd 1 element" << endl;
33     ivec.push_back(0);
34     printSizeCapacity(ivec);
35
36     cout << "\ncall shrink_to_fit()" << endl;
37     ivec.shrink_to_fit();
38     printSizeCapacity(ivec);
39
40     return 0;
41 }

运行结果:

时间: 2024-11-05 03:09:28

vector对象是如何增长的的相关文章

【足迹C++primer】27、vector对象是如何增长的

vector对象是如何增长的 当需要更多空间的时候,会重新分配比新空间需求更大的内存空间,作为备用 管理容器的成员函数 shrink_to_fit //只适用于vector,string,deque capacity reserve //只适用于vector,string c.shrink_to_fit() //请将capacity()减少为与size相同大小 c.capacity() //不重新分配内存空间的话,c可以保存多少元素 c.reserve(n) //分配至少能容纳n个元素的内存空间

[c++面试准备]--vector对象是如何增长的

参考资料:cpp primer 5th 背景: 为了支持快速的访问,vector/string将元素连续存储--每个元素都是紧挨着前一个元素存储. 如果我们向vector/string中添加新的元素,会发生什么:由于连续存放的缘故,当没有多余的空间来容纳新的元素的时候,容器必须分配新的空间来保存已有的元素和新元素,将已有元素从旧位置移动到新空间中,然后添加新的元素,释放旧的空间. vector不会对新添加的每一个元素都做上述操作,效率太慢.所以vector会预留一些空间.就是因为这些预留的空间,

STL—vector空间的动态增长

vector空间的动态增长 当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vector的空间动态增加大小,并不是在原空间之后的相邻地址增加新空间,因为vector的空间是线性连续分配的,不能保证原空间之后有可供配置的空间.因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就会失效. vector的size(),capacity(),reserve(),

C++primer(第五版)第九章 顺序容器(容器的运用及其部分习题解答,C++11特性总结,重点章节内容较多)

顺序容器:为程序员提供了控制元素存储和访问顺序的能力.(无序容器)           1.顺序容器的概述           A.顺序容器的类型           vector:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢.          deque:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快.           list:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快.          forword_list

C++ Primer 阅读笔记:迭代器和容器 小结

原创 by zoe.zhang  0.写在前面的话 我是在2011年学的C++,但是那一年恰好是C++11新标准的一年,但是大学上学的C++还是基于C++98的风格的,使用的编译器也是VC6.0,啊,插一句话,虽然VC6现在看起来有些简陋,而且也不支持C++新标准,但是因为它的轻便,以及有些年代感的编码界面,我自己感觉它就像是一柄钝剑,加上是我接触的第一个编译器,因此对它还是怀有敬意的.当然,现在用的VS2013,编程友好,功能强大,也是非常棒的了.它是支持C++11标准的.C++11相对C++

C++学习笔记(十五):vector对象在内存空间中是如何增长的

vector对象在内存空间中是如何增长的   我们都知道vector对象是动态存储的,从这一点看有点像链表,可以动态的增加或减少元素.我们也知道链表中是有指针变量,专门用于存储上一个和下一个元素的地址.正是因为这两个指针的存在,我们才能做到动态的存储数据,即不用像数组那样必须事先申请好空间.链表的缺点就是不能够快速的随机访问其中元素,必须通过指针层层查找. 但是,vector既可以实现动态存储数据,而且支持快速随机访问(用下标或者指针访问元素).对于能够用下标查找的数据类型,其存储方式必定是连续

vector的增长模式

引言 我们都知道vector对象是动态存储的,从这一点看有点像链表,可以动态的增加或减少元素.我们也知道链表中是有指针变量,专门用于存储上一个和下一个元素的地址.正是因为这两个指针的存在,我们才能做到动态的存储数据,即不用像数组那样必须事先申请好空间.链表的缺点就是不能够快速的随机访问其中元素,必须通过指针层层查找. 但是,vector既可以实现动态存储数据,而且支持快速随机访问(用下标或者指针访问元素).对于能够用下标查找的数据类型,其存储方式必定是连续的,即每个元素紧挨着前一个元素存储. 这

Vector容器 和 iteration 迭代器

vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. 使用vector之前,必须包含相应的头文件.#include <vector> using std::vector; vector是一个类模板(class template).模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上.

C++ Vector 使用总结

1. vector对象的size empty和size操作类似于string类型的相关操作(3.2.3节).成员函数size返回相应vector类定义的size_type的值. 使用size_type类型时,必须指出该类型是在哪里定义的.vector类型总是包括vector的元素类型: vector<int>::size_type        // ok vector::size_type          // error 2. 向vector添加元素 push_back()操作接受一个元