vector源码解析——GCC-2.95.1版本

vector = 数组 + 自动扩容(重点)

vector

在这里插入图片描述

1、数据结构

vector的数据结构就是数组,拥有一段连续的内存空间,特点是随机存取
查找快,时间复杂度O(1)
插入和删除慢(会造成内存块的拷贝),时间复杂度O(n)
与数组最大的区别是:不需要考虑容量问题,库里面已经实现了容量的动态增长

2、三个指针

在这里插入图片描述

这里有三个很重要的迭代器(指针)
protected:
  iterator start;
  iterator finish;
  iterator end_of_storage;

这三个指针控制容器的大小,所以vector的大小在64位下是2464位下指针的大小为8,32位下为4

在这里插入图片描述

3、扩容机制

这里有几个和扩容的相关的函数

push_back:
在这里插入图片描述
在这里插入图片描述

4、内置函数

begin()
end()
size()
capacity()
empty()
operator[]:这个看一下
front()
back()
reserve():这个看一下

相关问题

不管怎么问,容器的核心还是增删改查CURD

问题一、vector的size()的实现为什么不直接用finish-start???

这里的size()的实现是调用两个函数相减实现的
两点原因:
1、直接减快不了多少
2、存在源码里面不是finish,start这种情况

问题二、vector 扩容为什么要以1.5倍或者2倍扩容?

添加链接描述

问题三、vector如何释放内存?删除其中的元素,迭代器如何变化?删除元素时会不会释放内存空间?

问题四、vector 越界访问下标?

问题五、vector 的增加和删除是怎么实现的?

问题六、vector 与list的区别?

vector就是数组+动态扩容,list即使双向链表,所以vector和list的区别其实就是数组和链表的区别(考研常用的)

补充知识

条件编译:
#ifdef 标识符
程序段1
#else
程序段2
#endif
作用:当标识符被定义过,则对程序段1进行编译,否则对程序段2进行编译
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值