STL vector详解

1. 简介

本文参考vector源码,主要介绍vector的设计思路,了解一些方法的实现原理,内存机制,和一些实现的方法。

2. vector的内存机制

模板类vector是一种动态数组。在运行阶段可以设置vector对象的长度,可在末尾添加新数据,还可以在中间插入新数据。vector使用new和delete来管理内存,但这种工作是自动完成的,每次内存不够会自动开辟一段新的空间,自动开辟的空间大小是原空间大小的2倍,如果第一次开辟因为原来没有开辟空间就开辟1个字节的空间。其实从内存角度考虑vector就是使用三个指针管理一块内存,这三个指针分别是内存起始位置指针,数据存储终点位置指针,和内存终止位置指针。

3. vector 基类源码_Vector_base

源码如下:

template <class _Tp, class _Alloc> 
class _Vector_base {
public:
  typedef _Alloc allocator_type;
  allocator_type get_allocator() const { return allocator_type(); }

  _Vector_base(const _Alloc&)
    : _M_start(0), _M_finish(0), _M_end_of_storage(0) {}
  _Vector_base(size_t __n, const _Alloc&)
    : _M_start(0), _M_finish(0), _M_end_of_storage(0) 
  {
    _M_start = _M_allocate(__n);
    _M_finish = _M_start;
    _M_end_of_storage = _M_start + __n;
  }

  ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); }

protected:
  _Tp* _M_start;
  _Tp* _M_finish;
  _Tp* _M_end_of_storage;

  typedef simple_alloc<_Tp, _Alloc> _M_data_allocator;
  _Tp* _M_allocate(size_t __n)
    { return _M_data_allocator::allocate(__n); }
  void _M_deallocate(_Tp* __p, size_t __n) 
    { _M_data_allocator::deallocate(__p, __n); }
};

3.1. vector 基类成员变量

  _Tp* _M_start;  //vector存储数据存储的首地址
  _Tp* _M_finish; //vector存储数据存储的尾地址+1 其实就是vector::end()返回的迭代器
  _Tp* _M_end_of_storage; //vector占用内存的尾地址

其实vector中只有三个指针成员因此sizeof一个vector对象的大小就是sizeof指针大小的三倍,32bit系统和64bit系统可能会有一些差别。64bit系统中vector占用内存空间为3*8=24字节。

3.2. vector 基类方法

构造函数

  _Vector_base(const _Alloc&)  // 指定一个空间配置器
    : _M_start(0), _M_finish(0), _M_end_of_storage(0) {}
  _Vector_base(size_t __n, const _Alloc&)  //指定vector 空间大小__n*sizeof(_Tp) 指定一个空间配置器
    : _M_start(0), _M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值