转载:http://genwoxuec.blog.51cto.com/1852764/504999

C++面试题:介绍一下STL,具体说明STL如何实现vector。
考点:vector的理解与实现细节
出现频率:★★★★
解析:
前面例题已经介绍过了STL,因此这里不再赘述,只说明STL如何实现vector。
vector的定义如下:
        template<class _Ty, class _A = allocator<_Ty> >
        class vector {
        ……
        };
这里省略了中间的成员。其中_Ty类型用于表示vector中存储的元素类型,_A默认为allocator<_Ty>类型。
这里需要说明的是allocator类,它是一种“内存配置器”,负责提供内存管理(可能包含内存分配、释放、自动回收等能力)相关的服务。于是对于程序员来说,就不用关心内存管理方面的问题。
vector支持随机访问,因此为了效率方面的考虑,它内部使用动态数组的方式实现的。当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配,一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。例如下面的程序:
        #include <iostream>
        #include <vector>
        using namespace std;
        
        int main()
        {
                vector<int> v;       //初始时无元素,容量为0
                cout << v.capacity() << endl;
                v.push_back(1)    ; //容量不够,分配1个元素内存
                cout << v.capacity() << endl;
                v.push_back(2);     //容量不够,分配2个元素内存
                cout << v.capacity() << endl;
                v.push_back(3);     //容量不够,分配4个元素内存
                cout << v.capacity() << endl;
                v.push_back(4);
                v.push_back(5);     //容量不够,分配8个元素内存
                cout << v.capacity() << endl;
                v.push_back(6);
                v.push_back(7);
                v.push_back(8);
                v.push_back(9);      //容量不够,分配16个元素内存
                cout << v.capacity() << endl;
               
                return 0;
        }
下面是各个执行步骤:
(1)代码7行,初始化时v无元素(size为0),且容量(capacity)也为0。
(2)代码9行,在数组末尾添加元素1,由于容量不够,因此allocator分配1个int大小的内存,并把整数1复制到这个内存中。
(3)代码11行,在数组末尾添加元素2。此时容量为1,但元素个数需要变为2,因此容量不够,于是allocator先分配原来容量的2倍大小的内存(即2个int大小的内存),然后把原来数组中的1和新加入的2拷贝到新分配的内存中,最后释放原来数组的内存。
(4)代码13行,在数组末尾添加元素3。此时容量为2,而元素个数需要变为3,因此容量也不够。和(3)相同,allocator分配4个int的内存,然后把原来数组中的1、2以及新加入的3拷贝到新分配的内存,最后释放原数组的内存。
(5)代码15行,在数组末尾添加元素3。此时容量为4,而元素个数需要变为3,因此容量足够,不需要分配内存,直接把4拷贝到数组的最后即可。
以后的操作不再赘述。注意vector的size()和capacity()是不同的,前者表示数组中元素的多少,后者表示数组有多大的容量。由上面的分析可以看出,使用vector的时候需要注意内存的使用,如果频繁地进行内存的重新分配,会导致效率低下。
答案:
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库中,包括容器、算法、迭代器组件。
vector内部使用动态数组的方式实现的。如果动态数组的内存不够用,就要动态的重新分配,一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。它的内部使用allocator类进行内存管理,程序员不需要自己操作内存。

C++面试题:介绍一下STL,STL如何实现vector相关推荐

  1. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]

    最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...

  2. (134)FPGA面试题-介绍冯·诺依曼体系结构和哈佛体系结构

    1.1 FPGA面试题-介绍冯·诺依曼体系结构和哈佛体系结构 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍冯·诺依曼体系结构和哈佛体系结构: 5) ...

  3. (135)FPGA面试题-介绍FPGA的速度等级与温度等级

    1.1 FPGA面试题-介绍FPGA的速度等级与温度等级 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍FPGA的速度等级与温度等级: 5)结束语. ...

  4. (127)FPGA面试题-介绍FPGA 门控时钟

    1.1 FPGA面试题-介绍FPGA 门控时钟 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍FPGA 门控时钟: 5)结束语. 1.1.2 本节引 ...

  5. (123)FPGA面试题-介绍低速接口(UART、IIC、SPI),SPI有几根线,每根线的作用?(三)

    1.1 FPGA面试题-介绍低速接口(UART.IIC.SPI),SPI有几根线,每根线的作用?(三) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介 ...

  6. (111)FPGA面试题-介绍Verilog 块语句fork-join执行过程

    1.1 FPGA面试题-介绍Verilog 块语句fork-join执行过程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍Verilog 块语句f ...

  7. (110)FPGA面试题-介绍Verilog块语句begin-end执行过程

    1.1 FPGA面试题-介绍Verilog块语句begin-end执行过程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍Verilog块语句beg ...

  8. (108)FPGA面试题-介绍STA静态时序分析及其作用

    1.1 FPGA面试题-介绍STA静态时序分析及其作用 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍STA静态时序分析及其作用: 5)结束语. 1 ...

  9. C++ STL容器总结之vector(超详细版)

    一.vector简介 vector的中文翻译为向量,是一种C++ STL中的序列容器.它的是存储方式和C++语言本身提供的数组一样都是顺序存储,因此vector的操作和数组十分相似.但是和数组不一样的 ...

  10. 【Cuda并行编程之一】二分查找的探究以及Cuda的简单实现相关面试题介绍

    最近开始复习基础找工作,二分查找算是最基本而且十分重要的算法了,现在完整的解析一下,作为后面复习只用.内容分为几个部分: 一.二分查找的基本过程 折半查找技术,又称为二分查找.它的前提条件是线性表中的 ...

最新文章

  1. dockerfile php-fpm,1、使用dockerfile制作nginx+php-fpm镜像,实现lnmp。
  2. boost::hana::product用法的测试程序
  3. 【Centos 7】【Docker】 安装 redis
  4. 嵌入式码农的10年Bug调试经验,值得一看
  5. 在思科无线控制器上查看5GHz和2.4GHz的客户端数量
  6. flv 自动播放 html autostart=true,《网页制作之FLV视频播放代码的编写.doc
  7. mount 安卓system只读_Android如何让system分区可读写(MTK安卓6.0)-阿里云开发者社区...
  8. L3-020 至多删三个字符 (30 分) DP
  9. ul 原点显示_html ul li在div里圆点靠左对齐
  10. 解除诺顿企业版的 liveupdate 旁边小锁,解除限制 手动 更新诺顿的方法
  11. NoteExpress免费版只7个引文样式#NoteExpress免费版新增引文样式
  12. 9个offer,12家公司,35场面试,计算机应届毕业生求职之路
  13. Java 直接插入 CLOB/BLOB 数据到 Oracle 数据库
  14. 什么是FIDO、什么是FIPS浅理解
  15. 【图解版】深入web请求过程
  16. 世界上最值钱的初创公司
  17. 刷了 1000 多道算法题,一点小小的心得!
  18. 资产管理3大重要性,你还不知道吗?
  19. Altium Designer 错误: Component U1 LM833MM has unused sub-part (2).
  20. android 粒子爆炸特效

热门文章

  1. linux查看挂载内存卡,Ubuntu Linux 挂载移动硬盘、U盘、SD卡(对于新手)
  2. php本科毕设,基于php的新闻发布系统1本科毕设论文
  3. 基于java的心理健康网站的设计与实现_心理评测网站设计与实现(JSP,MySQL)(含录像)...
  4. springboot的配置文件加载的顺序,以及在不同位置配置下,加载的顺序
  5. layui表格合并单元格多表_layui合并单元格各种办法
  6. springcloud feign负载均衡_SpringCloud学习笔记(2)——Ribbon
  7. 模糊c均值聚类_聚类算法及其数据可视化
  8. iphone屏幕录制_苹果6s有屏幕录制吗
  9. php 回调cache 方案,基于PHP的一种Cache回调与自动触发技术
  10. 激活中国汽车媒体圈,杉车网与尾部汽车媒体的九死一生