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