STL vector容器

一、vector内部数据结构

vector类中的成员变量如下:

  _Tp* _M_start;     //目前使用的空间头部
  _Tp* _M_finish;    //目前使用的空间尾部
  _Tp* _M_end_of_storage;    //目前可用空间的尾部

创建个vector数组,就是用空间配置器开辟块内存,这时_M_start指向这块空间的头部,_M_end_of_storage指向这块空间的尾部,然后将数组中要存储的对象放入这块空间中,_M_finish指向这块空间中已用内存的尾部。
用一个图来具体说明:
在这里插入图片描述

二、vector迭代器

vector迭代器就是普通指针
源码如下:

  typedef _Tp value_type;
  typedef value_type* iterator;

因为普通指针天生就具备比如*,->,++,–,+=,-=等操作符,所以不需要额外的定义。并且由于具备了这么多操作符运算,所以vector迭代器属于Random Access Iterators类型迭代器。换句话说,所有普通指针都属于Random Access Iterators类型迭代器

三、关键算法展示

push_back

push_back是在数组的最后添加元素

  • 执行过程就是如果有备用空间,就直接将元素对象赋值给内存空间,使用placement new方法。
  • 如果没有备用空间,就先使用空间配置器开辟一块原来两倍大的内存,然后把原数组中的元素赋值过去,最后再把新元素添加到数组中。
insert (iterator __pos, size_type __n, const _Tp& __x)

这个函数就是在数组的__pos位置插入__n个元素,并且每个元素的值为__x,流程图如下,其中以具体的例子来讲解具体如何操作的。
在这里插入图片描述

情况一
在这里插入图片描述
第一步:将要__pos后面不会被覆盖的原数据拷贝到备用空间中对应的位置上
第二,三步:先将finish指针移到已用空间的最后,然后将会被覆盖的数据(就是灰色的方块)后移到对应的位置中
第四步:用新元素填充__pos后面的__n个位置。

情况二
在这里插入图片描述
第一,二步:先用新元素填充到不会覆盖原数据的位置,然后将finish指针移到已用空间的最后
第三,四步:将__pos后面的原数据拷贝到新添加的元素后面,然后移动到已用内存后面
第五步:然后再把一些新元素填充到__pos位置后面。
情况三
在这里插入图片描述
第一步:用空间配置器创建新的内存空间
第二步:将__pos位置前的旧元素拷贝到新内存空间
第三步:在__pos位置后面填充新元素
第四步:将原数组中的旧元素拷贝到新元素后面
注意:如果vector的空间不够,而采取了创建新的内存的方式,那么指向原来内存的迭代器就失效了,在使用vector迭代器时特别需要注意

四、resize和reserve

首先弄明白capacity和size的概念,在vector中,这两个函数是这样定义的:

size_type size() const { return size_type(end() - begin()); }
size_type capacity() const { return size_type(end_of_storage - begin()); }

所以capacity是备用空间加已用空间的大小,而size是已用空间的大小,而resize是控制已用空间size的大小,而reserve是控制capacity的大小。

五、阅读vector源码的一些感受

  • 在stl中,想要在内存中创建一个类对象,一般都是分为两步的,第一步先用内存配置器分配一块内存,第二步使用_Construct函数(就是placement new方法,先调用构造函数,再拷贝到内存中去)或者直接使用等号逐字节拷贝,将对象放置到对应的内存中去。
  • 在平时在内存中创建一个类对象,都是直接使用new在堆上创建,或者在栈上创建对象,只要一步就完成了。这是stl中需要特别注意的地方。


在执行过程中的拷贝,移动和填充,本质上都是调用_Construct函数或者直接使用等号逐字节拷贝,也就是①中所说的第二步过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值