深入分析STL标准模板vector.docx
- 文档编号:2385098
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:26
- 大小:662.28KB
深入分析STL标准模板vector.docx
《深入分析STL标准模板vector.docx》由会员分享,可在线阅读,更多相关《深入分析STL标准模板vector.docx(26页珍藏版)》请在冰豆网上搜索。
深入分析STL标准模板vector
深入分析STL标准模板——vector
——计算机学院--马晶义
摘要:
通过阅读c++的STL标准模板库中vector的源代码,分析STL中的内部成员、接口、内存管理、封装等方面。
Vector是一种顺序性的容器,按照严格线性存储各种对象。
它其实就是一种动态的数组,正如数组,vector有他们存储在存储单元相邻元素,这就意味着他们的元素可以被存取不只有使用迭代器还定期使用指针抵消元素。
但是不像普通的数组,存储在向量自动处理,允许它的扩展和简约的需要。
关键字:
STL、Vcector、内部成员函数、接口函数、封装
1、vector的声明及内部常用函数
1.vector的声明
vector
vector
vector
vector
c.~vector
2.vector容器中常用的函数。
(c为一个容器对象)
c.push_back(elem); 在容器最后位置添加一个元素elem
c.pop_back(); 删除容器最后位置处的元素
c.at(index); 返回指定index位置处的元素
c.begin(); 返回指向容器最开始位置数据的指针
c.end(); 返回指向容器最后一个数据单元的指针+1
c.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,否则返回false
c1.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函数
voidassign(size_type_Count,constType&_Val);
//_Count指要构造的vector成员的个数, _Val指成员的数值,他的类型必须与vector类型一致!
template
voidassign(InputIterator_First,InputIterator_Last);
//两个指针,分别指向复制开始和结束的地方!
例如:
运行结果:
【2】vector:
:
at
//指找到第N个vector成员,就跟我们再数组中找到第N个成员的a[N]类似
referenceat(size_type_Pos);
const_referenceat(size_type_Pos)const;
//找到第_Pos个成员
例如:
运行结果:
【3】vector:
:
back
referenceback();
const_referenceback()const;
返回最后一个的位置
例如:
运行结果:
3、vector内存管理相关方法
vector是一种序列式容器(其中的元素可以排序,但是并未排序)。
它和array一样,存储空间是一段连续的内存,因此支持随机访问,但是,和array相比,vector支持动态增加数据。
当使用new来进行动态内存分配,会有三个麻烦:
(1)必须确保会用delete这个分配;如果后面没有delete,new就会产生一个资源泄露。
(2)必须确保delete使用的是正确形式;对于分配一个单独的对象,必须使用“delete”。
对于分配一个数组,必须使用“delete[]”。
如果使用了delete的错误形式,结果会未定义。
在一些平台上,程序在运行期会死掉。
另一方面,它会默默的走向错误,有时候会造成资源泄露,一些内存也随之而去。
(3)一个new只delete一次,如果一个分配被删除了不止一次,结果也会未定义。
而STL中vector和string就不会这么麻烦了。
当准备动态分配一个数组(也就是,要写“newT[...]”,首先应考虑使用vcetor或string(一般来说,当T是字符类型的时候使用string,其他用vector,但vcetor
Vcetor和string消除了new和delete的麻烦,因为vector和string会管理自己的内存。
当元素添加到这些容器时它们的内存会增长,而且当一个vector或string销毁时,它们的析构函数会自动销毁容器中的元素,回收存放那些元素的内存。
另外,由于vector是序列容器,所以可以让我们支配作用于这样的容器的整个STL算法。
虽然数组也可以用于STL算法,但没有提供像begin、end和size这样的成员函数,也没有内嵌像iterator、reverse_iterator或value_type那样的typedef。
而且char*指针当然不能和提供了专用成员函数的string竞争。
容器的构造函数
1、C
2、Cc(c2); 创建c2的一个副本,C和c2必须有相同的容器类型及元素类型
3、Cc(b,e); 创建c,其元素是迭代器b,e范围之间元素的副本。
对于这一条,使用迭代器的时候,不要求容器类型相同。
容器内的元素类型也可以不同,只要他们相互兼容,能够将要复制的元素转化为所构建的新容器的元素类型,即可以实现复制。
4、Cc(n,t); 用n个值为t的元素创建容器c。
(仅适用于顺序容器)。
参数的顺序和语言相适应,n个t。
5、Cc(n); 创建含n个默认值的容器c。
(仅适用于顺序容器)。
1.template
2.class vector {
3....
4.protected:
5.//vector缺省使用alloc作为空间配置器,并据此另外定义了一个data_allocator,为的是更方便以元素大小为配置单位
6.//专属空间配置器,每次配置一个元素大小
7. typedef simple_alloc
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. // 定义于
25. uninitialized_fill_n(result, n, x); //全局函数
26. return result;
27. }
2.2push_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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 分析 STL 标准 模板 vector