STL源码剖析---容器篇vector

        在C++中,vector,list,deque,priority_queue,queue,stack,set,map,multiset,multimap等是我们较为常用的STL容器。其实STL也被分为:空间配置器、容器、迭代器、算法、仿函数、配接器这几大块知识;容器根据存储数据的方式被分为:关联式容器和序列式。其中加粗的是序列式容器,未加粗的是关联式容器;那么vector的底层是如何构成的?下面我们来进行探索;

        array数组,这是大家耳熟能详的数据结构,我们通常会int a[10] = {0};这样来定义一个空间大小为10,值全部为0的数组;vector其实也可以看做是数组,但是他却有自己的优势;array数组a,当我们要插入第11个元素时候,因为前期我们分配的空间不足,所以会造成无法插入第11个值,我们需要复制数组中的元素给另一个更大空间的数组;但是vector很好的解决了,空间不足的问题,因为他有自动扩容机制,当空间不足的时候vector会自己进行空间扩充,并且将元素进行插入;那vector的扩容机机制:申请一块更大的内存,让原内存数据拷贝到新内存里,再释放原内存。因此容器在进行内存的改变时,会导致迭代器失效。因为迭代器是指针,所以原来的内存发生改变,就不能够使用原来的迭代器了,会出现错误,这也是一个经意间会犯的错误;但是频繁的申请内存,会导致时间复杂度大,所以vector一般有自己的机制,会申请比需要内存的两倍,这样的话,下次如果还需要空间的话,就不一定要重新申请空间了;那么如何才能够节省时间呢?我们一般会使用reserve函数,对初始空间大小进行赋值,这样的话就可以避免初期申请内存所造成的大量时间开销;

        vector的数据结构:start,finish,end_of_storage; (都是迭代器)....这三个迭代器分别是:使用空间的首,使用空间的尾,目前可用空间的尾;

        vector的常用方法:push_back(),pop_back(),emplace_back(),begin(),end(),insert(),erase()等方法;

        NOTE: push_back()和emplace_back()两个方法都是将元素进行尾部插入,但是我们一般使用emplace_back(),因为他不是将元素进行复制后进行插入,而是直接在容器尾部创建了这个元素进行了插入,省略了拷贝/移动元素的过程;

        对于push_back() 和emplace_back()方法,我们在插入元素的时候,方法实现的细节其实都是需要先判断一下剩余空闲空间是否够用(end_of_storage - finish > q.size())如果够用,那我们就进行插入即可,但是如果不够用,我们就要进行申请更大的内存,元素复制,释放原来的内存,迭代器的重新指向等操作;

        其实从上面的表述中,我们可以看出对于在尾部插入一个元素,我们的时间复杂度(再不申请新空间的情况下)是O(1);但是我们如果要在头部插入一个元素,要使用insert()函数来进行,vector中并没有push_front()和pop_front()---可以使用s2.earse(s1.begin());

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值