带你深入浅出新面经:一、Vector底层实现原理

此为面经第一谈!可以关注我,每日带你深入浅出一个新面经。

我们要了解面经要如何“说”!

很重要!很重要!很重要!

我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)

码农不易,各位看官学到东西就点个赞支持支持吧!

开始部分:

总:首先Vector底层实现的是一个动态数组。

分:我们可以先从它的类结构进行讲解,vector是继承于vector_base,然后vector_base里面有三个比较重要的元素指针:

_M_start指向的是容器开始的位置、

_M_finish指向的是容器结束的位置、

_M_end_of_storage动态内存最后一个元素的下一个位置

然后我们可以再谈谈它的构造函数,它的构造函数分为两种:一种是无参构造:不申请动态内存,性能优先;第二种是很重要的,当你了解这个vector需要的元素有多少的时候,你需要使用初始化元素个数构造:主动申请动态内存,避免多次申请动态内存,导致影响性能。

然后我们再说一下它的一些基础操作: 

(增)插入元素操作:插入元素分为三种情况,插入尾部、头部、中间部分。我们先谈一下插入尾部,当元素插入尾部的时候,需要判断_M_finish指针和_M_end_of_storage指针是否指向同一个位置,若是,就需要翻倍拓展内存,再进行插入、若不是直接插入到_M_finish后面的一个内存位置,_M_finish指针向后移动一位即可。

再讲解插入头部和中间部分,插入前也是需要进行判断,内存是否需要翻倍拓展。不需要的话,待插位置后的元素向后平移一位,然后插入元素即可。(因为插入头部和中间部分是同一个情况)

(删)删除元素操作:删除操作也分为三种情况,删除尾部元素、头部元素、中间部分元素。我们也是先谈一下删除尾部元素,直接_M_finish指针向前移动一位即可。但是删除元素并不会释放已经申请的内存。插入头部和中间部分的元素,待插元素位置后的元素往前平移一位即可,也不会释放已经申请的内存。

(查)读取元素操作:有两种方法,一种是方括号[],还有一种是at()方法,两种方法都差不多。at()多了一个越界检查的操作,可以避免内存溢出。它们的返回值都是具体元素的引用

(改)修改元素操作:我们可以通过上面读取的具体元素引用,进行修改引用,达到修改vector元素的效果。或者先删除后插入,也是可以当作修改元素的一种操作。

释放空间操作:主要有两种,一种是swap一个空容器、一种是使用c++11的shrink_to_fit释放掉未使用的内存。

总:以上就是我对Vector底层实现原理的这个问题的一个理解和概括。

学习链接:https://xxetb.xetslk.com/s/3Kif2D

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值