STL源码剖析(八)序列式容器之vector

STL源码剖析(八)序列式容器之vector

一、容器简介

STL的容器分为序列式容器和关联式容器,所谓序列式容器是指其中的元素是可序的。所谓关联式容器,指的是每个元素都有key和value

STL有以下的序列式容器

vector
list
slist //非标准
deque
stack
queue
priority_queue

有以下关联式容器

set
map
multiset
multimap
hash_set //非标准
hash_map //非标准
hash_multiset //非标准
hash_multimap //非标准

本文将讲解vector容器

二、vector的数据结构

vecotr的定义如下

template <class T, class Alloc = alloc>
class vector {
	...
protected:
  typedef simple_alloc<value_type, Alloc> data_allocator; //空间配置器
  iterator start;
  iterator finish;
  iterator end_of_storage;
  ...
};

上述可以看到,vector定义了一个属于自己的空间配置器data_allocator,该空间配置器提供了静态的内存分配和释放方法,关于空间配置器请阅读STL源码剖析(二)普通的空间配置器STL源码剖析(三)更加精致的空间配置器这里不详细说明

下面重点看这三个成员

iterator start;
iterator finish;
iterator end_of_storage;

这是三个迭代器,是维护vector容器的重要成员

vector的内部会分配一大块内存,然后维护一个数组,其中start指向内存头部,finish指向数组最后一个元素的下一个位置,end_of_storage指向内存的尾部,如下图所示

在这里插入图片描述

数组是不可以动态生长的,vector内部虽然是数组,但是它是可以动态生长的,因为vector可以完成自动扩容

vector的扩容的方法是:申请一块更大的内存,将所有元素拷贝过去,将原本的内存析构释放。

因此vector的扩容是一个代价非常大的操作,所以每次扩容都会以两倍增长,由此来减少扩容次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值