首页 > 试题广场 >

STL中vector的实现原理 (衍生:Map, Set等实

[问答题]
STL中vector的实现原理 (衍生:Map, Set等实现原理)
推荐
vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用array,吃多少用多少。
      vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智。因为所谓扩充空间(不论多大),一如稍早所说,是”  配置新空间/数据移动/释还旧空间  “的大工程,时间成本很高,应该加入某种未雨绸缪的考虑。稍后我们便可看到SGI vector的空间配置策略了。
      另外,由于  vector维护的是一个连续线性空间,所以vector支持随机存取 
      注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,  对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了  。这是程序员易犯的一个错误,务需小心。
编辑于 2015-07-26 19:44:20 回复(1)
1、Vector是顺序容器,是一个动态数组,支持随机存取、插入、删除、查找等操作,在内存中是一块连续的空间。在原有空间不够情况下自动分配空间。vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下。
2、Map是关联容器,以键值对的形式进行存储,方便进行查找。关键词起到索引的作用,值则表示与索引相关联的数据。以红黑树的结构实现,插入删除等操作都在O(logn)时间内完成
3、Set是关联容器,set中每个元素只包含一个关键字。set支持高效的关键字查询操作——检查一个给定的关键字是否在set中。set也是以红黑树的结构实现,支持高效插入、删除等操作。
发表于 2015-08-05 09:02:19 回复(1)
普通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)
1.vector是由动态数组实现,初始时不必指定数组的大小,当vector的旧有空间满载,vector将以原大小的两倍配置新空间,将旧数据移动新的空间,释还旧空间。
2. STL中的容器都存在迭代器,vector也存在迭代器,这个迭代器是对指针的封装,里面重载了很多的运算符方法。
3. 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
发表于 2015-07-09 09:47:00 回复(0)
vector是array的动态版,Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,一般为原来的俩倍,将原来的数据复制过来,释放之前的内存。如果利用迭代器中中间插入一个元素的话,这个位置之后的所有的位置都要移动
发表于 2015-07-17 14:05:13 回复(0)
600000000000000006060000960000000000006000000000000090000003000点000000000mobo
发表于 2019-07-12 08:23:21 回复(0)
然后问为什么push_back的时间复杂度是O(1)
发表于 2017-04-14 16:57:55 回复(1)
1、vector是一个动态数组,开始时不用定义数组的大小,当输入的元素超过默认大小时,vector会自动增加相应大小;
2、STL中的容器都存在迭代器,vector也存在迭代器,这个迭代器是对指针的封装,里面重载了很多的运算符方法。
发表于 2015-06-08 21:44:50 回复(0)
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)
vector是长度可变的数组,STL中vector的底层也是数组,创建一个vector后,vector会在内部初始化一个默认大小的数组,然后插入的元素超过了默认数组的大小后,vector会新创建一个数组(肯定比原来的要大),将现在数组中的元素复制到新创建的数组中去,删除原来的数组。vector的插入是在数组中插入元素,将被插入位置以后的元素顺序的往后移动一个位置,删除也类似于插入。STL中的容器都存在迭代器,vector也存在着迭代器,这个迭代器其实是对指针的封装,里面重载了很多的运算符方法。
发表于 2015-05-18 10:35:04 回复(0)
用数组实现,当满时动态增加数组长度并且把之前的内容move过来。
发表于 2015-05-11 16:09:42 回复(0)
要答出其底层基本数据结构是数组,关键在于如果管理内存。vector的基本思路 是当数组空间不够时,会预先开辟双倍内存空间。内存空间由stl中的allocator进行分配。即使vector 进行clear操作后,这部分内存也不会释放掉;Map, Set的底层数据结构为红树,具体原理可以行搜索。推荐《STL源码剖析书》
编辑于 2015-05-18 13:03:40 回复(0)