STL中vector的实现以及面试问题
2018-03-22 11:22
2461 查看
一、杂谈
在学习C++的时候我们会接触两个库,一个是boost库,一个是STL库。关于STL在《STL源码剖析》这本书中侯捷先生讲的很清楚,今天我就关于STL中的vector实现以及面试中的一些相关的问题做一个详细解释。在网上看人家的面试经验的时候,看到C++关于vector是作为基础知识经常被问到的,如果面试官问你vector的底层实现原理,你会怎么回答?
二、vector的实现原理以及实现机制
关于vector简单的说就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下要容纳的数据的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后就会释放旧的空间。当删除的时候空间并不会释放只是清空了里面的数据。vector的数据安排以及操作方式与数组非常相似,两者唯一区别在于空间运用的灵活性,数组是静态空间一旦配置了就不能再改变大小,如果要增容的话,就要把数据搬到新的数组里面,然后再把原来的空间释放掉还给操作系统。vector是动态的随着元素的增加,它的内部机制会自动的扩充空间来容纳新的元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们不必害怕空间不足而一开始就开辟一块很大的内存。
vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧空间满载了,如果客户端每新增加一个元素,vector的内部只是扩充了一个元素空间,其实这样是比较不明智的。因为所谓的扩充空间(无论多大),过程都是配置新空间——数据移动——释放旧空间,成本还是比较高的。vector维护的是一个连续的线性空间,所以vector支持随机访问。
在vector的动态增加大小的时候,并不是在原有的空间上持续增加成新的空间(无法保证原空间的后面还有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原来的内容拷贝过来,并释放原来的空间。因此,对vector的任何操作一旦引起了空间的重新配置,指向原vector的所有迭代器会都失效了,这是比较容易犯的一个错误。
下面我们来看一下vector里的函数:
三、vector中的reserve和resize的区别
我们先来看一下C++中对resize与reservede的表示:reserve函数
void reserve(size_type size);reserve( )函数为当前vector预留至少能容纳size个元素的空间。(实际空间可能大于size)resize函数
void resize(size_type size,TYPE val);resize( )函数改变当前vector的大小为size,且对新创建的元素赋值valreserve:预留一定的空间
reserve是直接扩充到已经确定的大小,可以减少多次开辟、释放空间的问题,就可以提高效率,其次还可以减少多次要拷贝数据的问题。
reserve只是保证vector中的空间大小(capacity)最少达到参数所指定的大小n
在区间[0,n]的范围内,如果下标是index,vector[index]有可能是合法的,也有可能是非法的,具体视情况而定。
resize:重新分配大小
若要开辟的空间的size大于原来的size,那么resize之后要存放的数据就放在原size后的位置上。
若要开辟的空间小于原来的size则保留前n个数据(之后自动删除)
为了实现resize的语义,resize的接口做了两个保证:
1、保证区间[0, newsize]范围内的数据是有效的,下标index在这个区间内的话,那么vector[index]就是有效的。
2、保证区间[0, newsize]范围外的数据是无效的,下标index在这个区间外的话,那么vector[index]就是无效的。
reserve与resize的相同点:
就是它们都保证了vector空间的大小,至少达到它们参数所指定的大小。
相关文章推荐
- STL中vector的实现及面试问题
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- STL中vector的使用以及模拟实现
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- Josephus约瑟夫环问题STL模版类vector实现
- hashmap底层实现原理以及常见的面试问题
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- 简述stl 中set,vector,map的查找效率以及如何实现的?
- STL之heap及priority_queue实现以及源码中的两个小问题
- iframe自适应内层页面高度,可响应页面中折叠点击事件,以及实现跨域的问题解决方案
- 压榨编译器,用宏+C实现STL的VECTOR
- STL vector list deque区别与实现
- 实现二叉树以及链表发现的问题
- STL vector list deque区别与实现
- STL vector list deque区别与实现
- C++面试题:介绍一下STL,STL如何实现vector。
- STL的string类如何实现CString的Format功能 这是一个经典问题,记住
- 关于STL的vector查找问题 (解决NrNsNtNz_InTitle中 由 文本体中发现的标题未被正确识别出的NrNsNtNz)