1、首先看vector的最普通最常用的构造函数(vector< int >vec):无参构造
template <class _Tp, class _Alloc>
class _Vector_base {
public:
_Vector_base(const _Alloc&) //vector无参构造
: _M_start(0), _M_finish(0), _M_end_of_storage(0) {}
protected:
_Tp* _M_start; //指向第一个元素
_Tp* _M_finish; //指向最后一个元素的下一个
_Tp* _M_end_of_storage; //指向所分配内存的下一个
};
//vector的类,继承_Vector_base
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc> {
typedef _Vector_base<_Tp, _Alloc> _Base;
//allocator_type是一个类型分配器,每个构造函数都有一个
explicit vector(const allocator_type& __a = allocator_type())
: _Base(__a) {} //调用基类_Vector_base的构造函数
};
由此得出sizeof(vector)=16;
vector共有6种构造方式,每种方法都有类型分配器;第一在基类中开辟出需求个数元素的内存,第二调用fill或者copy函数进行数据复制;如下
//vector<int>vec(10,20); 构造一个有十个元素且值为20的vector
vector(size_type __n, const _Tp& __value,
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
{ _M_finish = uninitialized_fill_n(_M_start, __n, __value); }
vector(const vector<_Tp, _Alloc>& __x)
: _Base(__x.size(), __x.get_allocator())
{ _M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start); }
2、vector的各种方法:
iterator begin() { return _M_start; }
iterator end() { return _M_finish; }
void push_back(const _Tp& __x) {
if (_M_finish != _M_end_of_storage) {
construct(_M_finish, __x);
++_M_finish;
}
else
// 扩容 0-1-2-4-8 二倍扩容
_M_insert_aux(end(), __x);
}
// pop_back和erase方法,只向前移动了finsh指针,并没有改变原值(实践得出)
void pop_back() {
--_M_finish;
destroy(_M_finish);
}
iterator erase(iterator __position) {
if (__position + 1 != end())
copy(__position + 1, _M_finish, __position);
--_M_finish;
destroy(_M_finish);
return __position;
}
//返回最后一个指向元素的指针(end-1)
reverse_iterator rbegin()
{ return reverse_iterator(end()); }
// size方法
size_type size() const
{ return size_type(end() - begin()); }
//此方法指最多可包含元素个数
size_type max_size() const
{ return size_type(-1) / sizeof(_Tp); }
**size_type:unsigned int类型,所以size_type(-1)为2^32-1
//capacity方法得到vector的目前开辟内存可存放元素个数
size_type capacity() const
{ return size_type(_M_end_of_storage - begin()); }
//得到_n下标的元素;如大于元素个数,则抛出异常
reference at(size_type __n)
{ _M_range_check(__n); return (*this)[__n]; }
void _M_range_check(size_type __n) const {
if (__n >= this->size())
__stl_throw_range_error("vector");
}
/*
assign设置元素的值,可以看到
(1)当n大于capavity()时,重新开辟内存。然后交换容器
(2)当n大于元素个数时,改变全部元素值为val,且添加n-size()个val元素
(3)改变n个元素值为val后,删除n之后所有元素
*/
void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
void vector<_Tp, _Alloc>::_M_fill_assign(size_t __n, const value_type& __val)
{
if (__n > capacity()) {
vector<_Tp, _Alloc> __tmp(__n, __val, get_allocator());
__tmp.swap(*this);
}
else if (__n > size()) {
fill(begin(), end(), __val);
_M_finish = uninitialized_fill_n(_M_finish, __n - size(), __val);
}
else
erase(fill_n(begin(), __n, __val), end());
}