首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
STL中vector的实现原理 (衍生:Map, Set等实
[问答题]
STL中vector的实现原理 (衍生:Map, Set等实现原理)
查看答案及解析
添加笔记
邀请回答
收藏(470)
分享
纠错
12个回答
添加回答
17
推荐
simmon_hu
vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用array,吃多少用多少。
vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智。因为所谓扩充空间(不论多大),一如稍早所说,是”
配置新空间/数据移动/释还旧空间
“的大工程,时间成本很高,应该加入某种未雨绸缪的考虑。稍后我们便可看到SGI vector的空间配置策略了。
另外,由于
vector维护的是一个连续线性空间,所以vector支持随机存取
。
注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,
对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
。这是程序员易犯的一个错误,务需小心。
编辑于 2015-07-26 19:44:20
回复(1)
22
Tommyzt
1、Vector是顺序容器,是一个动态数组,支持随机存取、插入、删除、查找等操作,在内存中是一块连续的空间。在原有空间不够情况下自动分配空间。vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下。
2、Map是关联容器,以键值对的形式进行存储,方便进行查找。关键词起到索引的作用,值则表示与索引相关联的数据。以红黑树的结构实现,插入删除等操作都在O(logn)时间内完成
3、Set是关联容器,set中每个元素只包含一个关键字。set支持高效的关键字查询操作——检查一个给定的关键字是否在set中。set也是以红黑树的结构实现,支持高效插入、删除等操作。
发表于 2015-08-05 09:02:19
回复(1)
4
米醋
普通array和vector都是连续存储的区域,它们的不同是vector是以STL提供的具有次配置力的Alloc来分配存储空间的。array和vector都可以随机的访问任意位置。
vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用array,吃多少用多少。
vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智。因为所谓扩充空间(不论多大),一如稍早所说,是”
配置新空间/数据移动/释还旧空间
“的大工程,时间成本很高,应该加入某种未雨绸缪的考虑。稍后我们便可看到SGI vector的空间配置策略了。
另外,由于
vector维护的是一个连续线性空间,所以vector支持随机存取
。
注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,
对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
。这是程序员易犯的一个错误,务需小心。
发表于 2015-07-26 18:37:39
回复(1)
2
tony549285469
1.vector是由动态数组实现,初始时不必指定数组的大小,当vector的旧有空间满载,vector将以原大小的两倍
配置新空间,
将旧数据
移动新的空间,释还旧空间。
2.
STL中的容器都存在迭代器,vector也存在迭代器,这个迭代器是对指针的封装,里面重载了很多的运算符方法。
3.
对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
发表于 2015-07-09 09:47:00
回复(0)
1
得得小泽
vector是array的动态版,
Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,一般为原来的俩倍,将原来的数据复制过来,释放之前的内存。如果利用迭代器中中间插入一个元素的话,这个位置之后的所有的位置都要移动
发表于 2015-07-17 14:05:13
回复(0)
0
青苔轻缓爬满时光
600000000000000006060000960000000000006000000000000090000003000点000000000mobo
发表于 2019-07-12 08:23:21
回复(0)
0
Frozenflame
然后问为什么push_back的时间复杂度是O(1)
发表于 2017-04-14 16:57:55
回复(1)
0
小小娃爱吃甜食
1、vector是一个动态数组,开始时不用定义数组的大小,当输入的元素超过默认大小时,vector会自动增加相应大小;
2、STL中的容器都存在迭代器,vector也存在迭代器,这个迭代器是对指针的封装,里面重载了很多的运算符方法。
发表于 2015-06-08 21:44:50
回复(0)
0
NSDaBen
vector容器概述
vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用array,吃多少用多少。
vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智。因为所谓扩充空间(不论多大),一如稍早所说,是”
配置新空间/数据移动/释还旧空间
“的大工程,时间成本很高,应该加入某种未雨绸缪的考虑。稍后我们便可看到SGI vector的空间配置策略了。
另外,由于
vector维护的是一个连续线性空间,所以vector支持随机存取
。
注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,
对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
。这是程序员易犯的一个错误,务需小心。
具体源代码见《STL源码剖析》
发表于 2015-05-19 11:25:37
回复(0)
0
noble4cc
vector是长度可变的数组,STL中vector的底层也是数组,创建一个vector后,vector会在内部初始化一个默认大小的数组,然后插入的元素超过了默认数组的大小后,vector会新创建一个数组(肯定比原来的要大),将现在数组中的元素复制到新创建的数组中去,删除原来的数组。vector的插入是在数组中插入元素,将被插入位置以后的元素顺序的往后移动一个位置,删除也类似于插入。STL中的容器都存在迭代器,vector也存在着迭代器,这个迭代器其实是对指针的封装,里面重载了很多的运算符方法。
发表于 2015-05-18 10:35:04
回复(0)
0
gqqh
用数组实现,当满时动态增加数组长度并且把之前的内容move过来。
发表于 2015-05-11 16:09:42
回复(0)
0
陈木木
要答出其底层基本数据结构是数组,关键在于如果管理内存。vector的基本思路 是当数组空间不够时,会预先开辟双倍内存空间。内存空间由stl中的allocator进行分配。即使vector 进行clear操作后,这部分内存也不会释放掉;Map, Set的底层数据结构为红树,具体原理可以行搜索。推荐《STL源码剖析书》
编辑于 2015-05-18 13:03:40
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
C++
上传者:
陈木木
难度:
12条回答
470收藏
20821浏览
热门推荐
相关试题
运行 ldd hello 可以得到...
百度
C++
评论
(3)
编程题 ,按照要求创建Java 应...
Java
评论
(1)
微型计算机有三种总线,他们分别是数...
编程基础
评论
(1)
计算机系统中用于管理硬件和软件资源...
编程基础
评论
(1)
说出3个获取用户需求的方法并简述其...
用户研究
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题
vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智。因为所谓扩充空间(不论多大),一如稍早所说,是” 配置新空间/数据移动/释还旧空间 “的大工程,时间成本很高,应该加入某种未雨绸缪的考虑。稍后我们便可看到SGI vector的空间配置策略了。
另外,由于 vector维护的是一个连续线性空间,所以vector支持随机存取 。
注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此, 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 。这是程序员易犯的一个错误,务需小心。