深入分析STL标准模板·vector
stl中的vector原理

stl中的vector原理STL中的vector原理一、引言STL(Standard Template Library)是C++标准库的一部分,它提供了一组通用的模板类和函数,用于处理常见的数据结构和算法。
其中,vector是STL中最常用的容器之一。
本文将介绍vector的原理以及其在实际应用中的使用。
二、vector的概述vector是一种动态数组,它可以根据需要自动调整自身的大小。
与数组相比,vector具有更好的灵活性和易用性。
vector中的元素在内存中是连续存储的,可以通过下标快速访问。
三、vector的底层实现vector的底层实现是一个动态分配的数组。
当元素数量超过当前容量时,vector会自动重新分配更大的内存空间,并将原有元素拷贝到新的内存空间中。
这种自动扩容的机制保证了vector的动态性。
四、vector的常用操作1. 插入元素:可以使用push_back()函数在vector的末尾插入一个元素,也可以使用insert()函数在任意位置插入元素。
插入元素后,vector的大小会自动增加。
2. 删除元素:可以使用pop_back()函数删除vector的最后一个元素,也可以使用erase()函数删除指定位置的元素。
删除元素后,vector的大小会自动减小。
3. 访问元素:可以使用下标运算符[]来访问vector中的元素,也可以使用at()函数。
下标运算符不会进行越界检查,而at()函数会进行越界检查,避免访问不存在的元素导致程序崩溃。
4. 修改元素:可以使用下标运算符或者at()函数修改vector中的元素。
5. 获取容量:可以使用capacity()函数获取vector当前的容量,即vector可以容纳的元素个数。
当元素数量超过容量时,vector 会自动进行扩容。
6. 获取大小:可以使用size()函数获取vector当前的大小,即vector中实际存储的元素个数。
五、vector的优点和缺点1. 优点:(1)动态性:vector可以根据需要自动调整自身的大小,非常灵活。
C++标准库类模板vector

C++标准库类模板vector vector是C++标准库STL中的⼀个重要的类模板,相当于更健壮的更多附加能⼒的数组使⽤vector前⾸先要包含头⽂件#include<vector>1.vector的常⽤操作:vector < int > vector_1(size) //创建⼀个数组vector_1,长度为sizevector<int> vector_2(vector_1) //创建⼀个数组vector_2,并把vector_1中所有元素复制过去vector<int> vector_3(vector_1.begin(),vector_1.begin()+N)//创建⼀个数组vector_3,并把vector_1中前N个元素复制过去vector < int > vector_4(size,num) //创建⼀个数组vector_1,长度为size,初始化元素为numvector.resize(size); //重新设置数组⼤⼩为sizevector.front() //返回数组⾸元素vector.back() //返回数组尾元素vector.begin() //获取数组头指针vector.end() //获取数组尾指针vector.size() //返回数组的长度vector[i] //访问数组的第i-1个元素vector.insert(vector.begin()+N,elem); //在数组的第N个元素后插⼊元素elem.vector.push_back(elem); //在数组的最后⼀个元素后插⼊⼀个元素elem.vector.erase(vector.begin()+M,vector.begin()+N);//删除数组的第M个到第N个元素vector.pop_back(); //删除数组的最后⼀个元素vector.clear(); //清空数组中的元素vector.empty(); //判断数组是否为空,若为空返回true,不为空返回false例:/****Author:cyl*Time:2019-3-1 22:00:45*FUnction:Use of vector***/#include <iostream>#include <iomanip>#include <cstring>#include <cstdio>#include <cstdlib>#include<vector>using namespace std;int main(){//vector是⼀个可存放任意类型数据的动态数组//数据类型除了int类型还可为其他的类型 ,size可为⼀个常量或变量//初始化后向量integer中默认值为0;int size = 10;vector < int > integers(size);//复制向量integer,复制为integers1vector<int> integers1(integers);//复制向量integer前5个元素,复制为integers2vector<int> integers2(integers.begin(),integers.begin()+5);//创建 integers3长度为size,默认值为1vector < int > integers3(size,1);integers.front();//获取⾸元素integers.back();//获取尾元素integers.begin();//获取头指针integers.end(); //获取尾指针//获取向量 integers的长度cout<<"integers的长度:"<<integers.size()<<endl;//通过下标读取元素for(int i = 0;i<integers.size();i++){cout<<setw(4)<<integers[i];}//通过下标输⼊元素for(int i = 0;i<integers.size();i++){cin>>integers[i];}//在 integers的第n个元素后插⼊元素123.int n = 1;integers.insert(integers.begin()+n,123);//在integers的最后⼀个元素后插⼊⼀个元素 123.integers.push_back(123);//删除integers的第m个到第n个元素 (第1个到第3个)int m = 1;n = 3;integers.erase(integers.begin()+m,integers.begin()+n);//删除integers的最后⼀个元素integers.pop_back();//清空 integers中的元素integers.clear();//返回integers是否为空,若为空返回1,不为空返回0integers.empty();return 0;}2.使⽤vector 创建⼆维数组vector< vector<int> > matrix_vector(SIZE_ROW, vector<int> (SIZE_COL)); //创建⼀个⼆维数组,⾏数为SIZE_ROW,列数为SIZE_COL./****Author:cyl*Time:2019-3-14 22:00:45*FUnction:Use of 2d vector***/#include <iostream>#include <iomanip>#include <cstring>#include <cstdio>#include <cstdlib>#include <vector>using namespace std;int main(){//创建⼀个3⾏3列数组vector< vector<int> > v2d(3, vector<int> (3));//赋值for(int i = 0;i<v2d.size();i++){for(int j = 0;j<v2d[0].size();j++){v2d[i][j] = i*v2d[0].size()+j;}}//输出for(int i = 0;i<v2d.size();i++){for(int j = 0;j<v2d[0].size();j++){ cout<<setw(5)<<v2d[i][j];}cout<<endl;}cout<<endl<<endl;//将⼆维数组重新设置⾏列数//先重新设置⾏数再重新设置列数 v2d.resize(8);for(int i = 0;i<v2d.size();i++){v2d[i].resize(8);}//赋值for(int i = 0;i<v2d.size();i++){for(int j = 0;j<v2d[0].size();j++){ v2d[i][j] = i*v2d[0].size()+j;}}//输出for(int i = 0;i<v2d.size();i++){for(int j = 0;j<v2d[0].size();j++){ cout<<setw(5)<<v2d[i][j];}cout<<endl;}return 0;}。
C++ 标准模板库(STL)学习总结

C++标准模板库(STL)顺序性容器1.C++ Vector(向量容器)vector提供如下函数或操作:clear() 移除容器中所有数据empty() 判断容器是否为空erase(pos) 删除pos位置的数据erase(beg,end) 删除[beg,end)区间的数据front() 传回第一个数据back()返回vector中末尾元素的引用data()返回指向vector内存的指针insert(pos,elem) 在pos位置插入一个elem拷贝pop_back() 删除最后一个数据push_back(elem) 在尾部加入一个数据resize(num) 重新设置该容器的大小size() 返回容器中实际数据的个数max_size()函数返回vector能够容纳的最大元素个数begin() 返回指向容器第一个元素的迭代器end() 返回指向容器最后一个元素的迭代器capacity()返回vector中实际分配的内存大小reverse()改变vector的容量大小,当vector的容量设定时,vector的容量不会因此动态分配operator[ ]()获取vector中元素,这个和C中获取数组元素一样at()获取vector中的元素,这个和[]的作用一样,不过和[]不同的是,at()函数要对数组的边界进行检查,如果越界就会抛出异常,但是[]不会。
2.C++ List(链表)Lists将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.assign() 给list赋值back() 返回最后一个元素begin() 返回指向第一个元素的迭代器clear() 删除所有元素empty() 如果list是空的则返回trueend() 返回末尾的迭代器erase() 删除一个元素front() 返回第一个元素get_allocator() 返回list的配置器insert() 插入一个元素到list中max_size() 返回list能容纳的最大元素数量merge() 合并两个listpop_back() 删除最后一个元素pop_front() 删除第一个元素push_back() 在list的末尾添加一个元素push_front() 在list的头部添加一个元素rbegin() 返回指向第一个元素的逆向迭代器remove() 从list删除元素remove_if() 按指定条件删除元素rend() 指向list末尾的逆向迭代器resize() 改变list的大小reverse() 把list的元素倒转size() 返回list中的元素个数sort() 给list排序splice() 合并两个listswap() 交换两个listunique() 删除list中重复的元素3.C++ deque(双向队列)容器deque和vector非常相似,操作函数基本一致。
vector用法

vector用法Vector是C++标准模板库(STL)中提供的最常用的容器之一,是一种多功能的动态数组,允许存储任意大小的数据集合,并能够自动更新其内部结构以方便存取,而不需要任何编程技巧即可使用。
Vector的特性极大地简化了程序员的编码任务,使得程序员可以节约大量的时间来进行编写,并改善应用程序的性能。
因此,Vector是C++语言开发人员最常用的容器之一。
Vector从语法上来看,是一种模板,它允许存储任意大小的数据集合,并能够自动更新其内部结构以方便存取。
该模板接受任意类型的参数,这样程序员就可以根据实际情况创建适合自己需求的容器。
Vector的优点主要有:Vector可以容纳任意大小的数据集合,不必担心容量的增长。
Vector的随机访问功能非常强大,可以快速获取任何元素。
Vector支持动态扩容,可以自动增长容量,以容纳更多数据。
Vector具有内存安全性,可以防止非法写入或读取操作。
Vector支持排序,可以帮助快速搜索所需数据。
Vector支持快速删除任何元素,同时仍保持数据有序。
Vector具有可移植性,可以将其放置在任何位置,以满足程序开发需求。
Vector常用的函数有:push_back:将给定元素以相继方式添加到Vector尾部。
pop_back:从Vector尾部移除一个元素。
size:返回Vector中元素个数。
empty:返回Vector是否为空。
begin:返回Vector头部迭代器。
end:返回Vector尾部迭代器。
clear:清空Vector中的所有元素。
sort:按照升序排序Vector中的元素。
Vector在使用时需要注意的问题:Vector可能带来额外的开销:使用Vector对内存开销更高,因为Vector内部实现了很多内存分配和释放机制来实现其可扩展性,这会带来一定的效率损失。
Vector可能比其他容器更慢:Vector的容量增长机制会使其比一般的数组慢很多,因为它需要频繁的内存移动操作才能保持插入元素时的有序性。
STL标准模板库向量容器(vector)

STL标准模板库向量容器(vector)向量容器使⽤动态数组存储、管理对象。
因为数组是⼀个随机访问数据结构,所以可以随机访问向量中的元素。
在数组中间或是开始处插⼊⼀个元素是费时的,特别是在数组⾮常⼤的时候更是如此。
然⽽在数组末端插⼊元素却很快。
实现向量容器的类名是vector(容器是类模板)。
包含vector类的头⽂件名是vector。
所以,如果要在程序⾥使⽤向量容器,就要在程序中包含下⾯语句:#include <vector>此外,在定义向量类型对象时,必须指定该对象的类型,因为vector类是⼀个类模板。
例如,语句:vector<int> intList;将intList声明为⼀个元素类型为int的向量容器对象。
类似地,语句:vector<string> stringList;将stringList声明为⼀个元素类型为string的向量容器对象。
声明向量对象vector类包含了多个构造函数,其中包括默认构造函数。
因此,可以通过多种⽅式来声明和初始化向量容器。
表⼀描述了怎样声明和初始化指定类型的向量容器。
表⼀各种声明和初始向量容器的⽅法语句作⽤vector<elementType> vecList; 创建⼀个没有任何元素的空向量vecList(使⽤默认构造函数)vector<elementType> vecList(otherVecList)创建⼀个向量vecList,并使⽤向量otherVecList中的元素初始化该向量。
向量vecList与向量otherVecList的类型相同vector<elementType> vecLIst(size);创建⼀个⼤⼩为size的向量vecList,并使⽤默认构造函数初始化该向量 vector<elementType>vecList(n,elem);创建⼀个⼤⼩为n的向量vecList,该向量中所有的n个元素都初始化为elemvector<elementType> vecList(begin,end);创建⼀个向量vecList,并初始化该向量(begin,end)中的元素。
STL vector用法介绍

介绍这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。
本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。
通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。
Vector总览vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:using std::vector;vector<int> vInts;或者连在一起,使用全名:std::vector<int> vInts;建议使用全局的命名域方式:using namespace std;在后面的操作中全局的命名域方式会造成一些问题。
vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。
Vector成员函数函数表述c.assign(beg,end) c.assign(n,elem)将[beg; end)区间中的数据赋值给c。
将n个elem的拷贝赋值给c。
c.at(idx)传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back()传回最后一个数据,不检查这个数据是否存在。
c.begin()传回迭代器重的可一个数据。
c.capacity()返回容器中数据个数。
c.clear()移除容器中所有数据。
c.empty()判断容器是否为空。
c.end()指向迭代器中的最后一个数据地址。
C++标准模板库(STL)vector的常见用法详解

C++标准模板库(STL)vector的常见⽤法详解vector翻译为向量,但是这⾥使⽤“变长数组”的叫法更容易理解,也即“长度根据需要⽽⾃动改变的数组”。
在考试题中,有时会碰到只⽤普通数组会超内存的情况,这种情况使⽤vector会让问题的解决便捷许多。
另外,vector还可以⽤来以邻接表的⽅式储存图,这对⽆法使⽤邻接矩阵的题⽬(结点数太多)、⼜害怕使⽤指针实现邻接表的读者是⾮常友好的,写法也⾮常简洁。
如果要使⽤vector,则需要添加vector头⽂件,即 #include <vector>. 除此之外,还需要再头⽂件下⾯加上⼀句“using namespace std;”,这样就可以在代码中使⽤vector了。
下⾯来看vector的⼀些常见⽤法。
1. vector的定义单独定义⼀个vector:vector<typename>name;上⾯这个定义其实相当于是⼀维数组name[SIZE],只不过其长度可以根据需要进⾏变化,⽐较节省空间,说通俗了就是“变长数组”。
和⼀维数组⼀样,这⾥的typename可以是任何基本类型,例如int,double,char,结构体等,也可以是STL标准容器,例如vector、set、queue等。
需要注意的是,如果typename也是⼀个STL容器,定义的时候要记得在>>符号之间加上空格,因为⼀些使⽤C++11之前标准的编译器会把它视为移位操作,导致编译错误,下⾯是⼀些简单的例⼦:vector<int> name;vector<double> name;vector<char> name;vector<node> name; //node是结构体的类型如果typename是vector,就是下⾯的定义:vector<vector<int> >name; //>>之间要加空格可以很容易联想到⼆维数组的定义,即其中⼀维是⼀个数组的数组。
【C++】stl vector使用

vector概述stl vector是序列容器模板类,其支持指定类型的数据存储和随机访问;对于vector而言,如果在其尾部插入或删除项,其时间复杂度为常量;如果在中间或者头部插入或者删除项,则其时间复杂度为线性的,因为为了保持原本的相对次序,在插入或者删除项之后的所有项都必须进行移动;简单的说:vector类似于动态数组的概念,该动态数据能容纳任何类型的对象,并且可以按需动态伸缩空间;个人认为其内存存储方式为连续的,这样才会有随机访问的特性,vector的空间模型如下所示:引用vector由于vector为C++标准库的一部分,因此在安装集成开发环境的时候(如visual studio 2008),标准库就已经被包含进来了;在需要使用vector的文件中,使用#include <vector>将其头文件包含进行,由于vector是std命名空间的一部分,因此使用using namespace std命令式使程序能够识别vectorvector迭代成员begin:返回指向vector第一个元素的迭代器end:返回指向vector末尾的迭代器(注意:是指向vector末尾,不是指向vector的最后一个元素)常用的vector构造函数构造一个空元素的vector对象vector<Element>v;构造一个容纳10个元素的vector对象(并不表示其最多只能容纳10个元素)vector<Element>v(10);构造一个容纳10个元素的vector对象并初始化各个元素项vector<Element>v(10,Element());构造一个原有的vector对象的拷贝vector<Element>v(v1);添加元素使用push_back函数将元素添加至vector的末尾等其他方式获得vector的元素个数使用size函数可以获得vector的元素个数,如果判断vector 的元素个数是否为0,建议使用empty函数注意事项remove_if函数的使用,以下图为例(图中表示去除包含字符o的元素项)在上图的右边中,其size大小为8,capacity大小为12。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入分析STL标准模板——vector——计算机学院--马晶义摘要:通过阅读c++的STL标准模板库中vector的源代码,分析STL 中的内部成员、接口、内存管理、封装等方面。
Vector 是一种顺序性的容器,按照严格线性存储各种对象。
它其实就是一种动态的数组,正如数组,vector有他们存储在存储单元相邻元素,这就意味着他们的元素可以被存取不只有使用迭代器还定期使用指针抵消元素。
但是不像普通的数组,存储在向量自动处理,允许它的扩展和简约的需要。
关键字:STL、Vcector、内部成员函数、接口函数、封装一、vector的声明及内部常用函数1.vector的声明vector<ElemType> c; 创建一个空的vectorvector<ElemType> c1(c2); 创建一个vector c1,并用c2去初始化c1 vector<ElemType> c(n) ; 创建一个含有n个ElemType类型数据的vector;vector<ElemType> c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;c.~vector<ElemType>(); 销毁所有数据,释放资源;2.vector容器中常用的函数。
(c为一个容器对象)c.push_back(elem); 在容器最后位置添加一个元素elemc.pop_back(); 删除容器最后位置处的元素c.at(index); 返回指定index位置处的元素c.begin(); 返回指向容器最开始位置数据的指针c.end(); 返回指向容器最后一个数据单元的指针+1c.front(); 返回容器最开始单元数据的引用c.back(); 返回容器最后一个数据的引用c.max_size(); 返回容器的最大容量c.size(); 返回当前容器中实际存放元素的个数c.capacity(); 同c.size()c.resize(); 重新设置vector的容量c.reserve(); 同c.resize()c.erase(p); 删除指针p指向位置的数据,返回下指向下一个数据位置的指针(迭代器)c.erase(begin,end) 删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)c.clear(); 清除所有数据c.rbegin(); 将vector反转后的开始指针返回(其实就是原来的end-1)c.rend(); 将vector反转后的结束指针返回(其实就是原来的begin-1)c.empty(); 判断容器是否为空,若为空返回true,否则返回falsec1.swap(c2); 交换两个容器中的数据c.insert(p,elem); 在指针p指向的位置插入数据elem,返回指向elem位置的指针c.insert(p,n,elem); 在位置p插入n个elem数据,无返回值c.insert(p,begin,end) 在位置p插入在区间[begin,end)的数据,无返回值二、vector接口函数实例分析【1】vector::assign //用来构造一个vector的函数,类似于copy函数void assign( size_type _Count, const Type& _Val);//_Count指要构造的vector成员的个数,_Val指成员的数值,他的类型必须与vector类型一致!template<class InputIterator>void assign( InputIterator _First, InputIterator _Last );//两个指针,分别指向复制开始和结束的地方!例如:运行结果:【2】vector::at//指找到第N个vector成员,就跟我们再数组中找到第N个成员的a[N]类似reference at( size_type _Pos);const_reference at( size_type _Pos) const;//找到第_Pos个成员例如:运行结果:【3】vector::backreference back( );const_reference back( ) const;返回最后一个的位置例如:运行结果:三、vector内存管理相关方法vector是一种序列式容器(其中的元素可以排序,但是并未排序)。
它和array一样,存储空间是一段连续的内存,因此支持随机访问,但是,和array相比,vector支持动态增加数据。
当使用new来进行动态内存分配,会有三个麻烦:(1)必须确保会用delete这个分配;如果后面没有delete,new就会产生一个资源泄露。
(2)必须确保delete使用的是正确形式;对于分配一个单独的对象,必须使用“delete”。
对于分配一个数组,必须使用“delete[]”。
如果使用了delete的错误形式,结果会未定义。
在一些平台上,程序在运行期会死掉。
另一方面,它会默默的走向错误,有时候会造成资源泄露,一些内存也随之而去。
(3)一个new只delete 一次,如果一个分配被删除了不止一次,结果也会未定义。
而STL中vector和string就不会这么麻烦了。
当准备动态分配一个数组(也就是,要写“new T[...]”,首先应考虑使用vcetor 或string(一般来说,当T是字符类型的时候使用string,其他用vector,但vcetor<char>也可以用作T是字符数组的时候)。
Vcetor 和string消除了new和delete的麻烦,因为vector和string会管理自己的内存。
当元素添加到这些容器时它们的内存会增长,而且当一个vector或string销毁时,它们的析构函数会自动销毁容器中的元素,回收存放那些元素的内存。
另外,由于vector是序列容器,所以可以让我们支配作用于这样的容器的整个STL算法。
虽然数组也可以用于STL算法,但没有提供像begin、end和size这样的成员函数,也没有内嵌像iterator、reverse_iterator或value_type那样的typedef。
而且char*指针当然不能和提供了专用成员函数的string竞争。
容器的构造函数1、C<T> c; 创建空容器2、C c(c2); 创建c2的一个副本,C和c2必须有相同的容器类型及元素类型3、C c(b,e); 创建c,其元素是迭代器b,e范围之间元素的副本。
对于这一条,使用迭代器的时候,不要求容器类型相同。
容器内的元素类型也可以不同,只要他们相互兼容,能够将要复制的元素转化为所构建的新容器的元素类型,即可以实现复制。
4、C c(n,t); 用n个值为t的元素创建容器c。
(仅适用于顺序容器)。
参数的顺序和语言相适应,n个t。
5、C c(n); 创建含n个默认值的容器c。
(仅适用于顺序容器)。
1.template <class T, class Alloc = alloc>2.class vector {3....4.protected:5.//vector缺省使用alloc作为空间配置器,并据此另外定义了一个data_allocator,为的是更方便以元素大小为配置单位6.//专属空间配置器,每次配置一个元素大小7.typedef simple_alloc<value_type, Alloc> data_allocator;8....9. vector() : start(0), finish(0), end_of_storage(0) {}10. vector(size_type n, const T& value) { fill_initialize(n, value); }11. vector(int n, const T& value) { fill_initialize(n, value); }12. vector(long n, const T& value) { fill_initialize(n, value); }13.explicit vector(size_type n) { fill_initialize(n, T()); }14....15.void fill_initialize(size_type n, const T& value) {16. start = allocate_and_fill(n, value); //配置空间并设初值17. finish = start + n; // 调整范围18. end_of_storage = finish; // 调整范围19. }20.iterator allocate_and_fill(size_type n, const T& x) {21. iterator result = data_allocator::allocate(n); //配置n个元素空间22. __STL_TRY {23.// 全局函数,将result所指的未初始化空间设定为n个初值为x的变量24.// 定义于 <stl_uninitialized.h>。
25. uninitialized_fill_n(result, n, x); //全局函数26.return result;27. }2.2 push_back()操作时vector内部的过程push_back()操作将新元素插入容器尾部,该函数首先检查是否还有备用空间(finish!=end_of_storage),如果有那么就直接在备用空间上构造元素,并调整迭代器finish。
如果没有备用空间了(finish= end_of_storage),就扩充空间(重新配置,移动数据,释放原空间)。
1.void push_back(const T& x) {2.if (finish != end_of_storage) { // 还有备用空间3. construct(finish, x); // 直接在备用空间中构建元素4. ++finish; // 调整范围5. }6.else// 已无备用空间7. insert_aux(end(), x);8. }9.10.template <class T, class Alloc>11.void vector<T, Alloc>::insert_aux(iterator position, const T& x) {12.if (finish != end_of_storage) { // 还有备用空间13.// 在备用空间起始处构造一个元素,并以vector最后一个元素值为其初值14. construct(finish, *(finish - 1));15. ++finish;16.// 以下做啥用?17. T x_copy = x;18. copy_backward(position, finish - 2, finish - 1);19. *position = x_copy;20. }21.else { // 已無備用空間22.const size_type old_size = size();//此时的size()等同于capacity()23.const size_type len = old_size != 0 ? 2 * old_size : 1;24.// 以上配置原则:如果原大小为0,那么则配置1(个元素大小)25.// 如果原大小不为0,那么配置原大小的2倍26.// 前半段用来放置原数据,后半段用来放置新数据27.28. iterator new_start = data_allocator::allocate(len); // 实际配置29. iterator new_finish = new_start;30. __STL_TRY {31.// 复制32. new_finish = uninitialized_copy(start, position, new_start);33. construct(new_finish, x);34. ++new_finish;35.// 将安插点的原内容页拷贝过来(该函数也可能被insert(p,x)调用)36. new_finish = uninitialized_copy(position, finish, new_finish);37. }38.catch(...) {39.// "commit or rollback"(如果不成功那么一个都不留)40. destroy(new_start, new_finish);41. data_allocator::deallocate(new_start, len);42.throw;43. }44.45.// 解构并释放原vector46. destroy(begin(), end());47. deallocate();48.49.// 调整迭代器,指向新vector50. start = new_start;51. finish = new_finish;52. end_of_storage = new_start + len;53. }54.}所谓的vector的大小的动态增长,并不是在原空间之后连续新空间(因为无法保证原空间之后尚有可供配置的空间)。