此为面经第一谈!可以关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位看官学到东西就点个赞支持支持吧!
开始部分:
总:首先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底层实现原理的这个问题的一个理解和概括。