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

12 篇文章 1 订阅
STL中vector的实现原理 (衍生:Map, Set等实现原理)

10个回答

添加回答
  • 推荐
    vector的数据安排以及操   查看全部
    编辑于 2015-07-26 19:44:20 回复(0)
    评论加载中...
      回复
    • 1、Vector是顺序容器,是一个动态数组,支持随机存取、插入、删除、查找等操作,在内存中是一块连续的空间。在原有空间不够情况下自动分配空间。vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下。
      2、Map是关联容器,以键值对的形式进行存储,方便进行查找。关键词起到索引的作用,值则表示与索引相关联的数据。以红黑树的结构实现,插入删除等操作都在O(logn)时间内完成
      3、Set是关联容器,set中每个元素只包含一个关键字。set支持高效的关键字查询操作——检查一个给定的关键字是否在set中。set也是以红黑树的结构实现,支持高效插入、删除等操作。
      发表于 2015-08-05 09:02:19 回复(0)
    • 普通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)
    • vector是array的动态版, Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,一般为原来的俩倍,将原来的数据复制过来,释放之前的内存。如果利用迭代器中中间插入一个元素的话,这个位置之后的所有的位置都要移动
      发表于 2015-07-17 14:05:13 回复(0)
    • 1.vector是由动态数组实现,初始时不必指定数组的大小,当vector的旧有空间满载,vector将以原大小的两倍 配置新空间,将旧数据移动新的空间,释还旧空间。
      2. STL中的容器都存在迭代器,vector也存在迭代器,这个迭代器是对指针的封装,里面重载了很多的运算符方法。
      3. 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
      发表于 2015-07-09 09:47:00 回复(0)
    • 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源码剖析书》


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值