上回我们分析了push_back函数。接下来我们来看下pop_back函数。递减_M_finish指针,然后析构最后一个对象,但是内存不会进行释放,即capacity接口返回值不变。这也说明了为何没有pop_front接口;倘若有,那么每一次调用都得将所有对象向前移动,vector不擅长此类操作。
void pop_back()
{
/*
* 递减_M_finish指针, 并对最后一个对象执行析构
*/
--this->_M_impl._M_finish;
_Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
}
相比起pop_back接口,erase接口的工作则昂贵得多。首先当删除对象并非最后一个时,需将删除位置往后对象全部向前移动。然后再析构最后一个对象,同样的,erase不会释放内存。或许你会好奇,为什么是析构最后一个对象?
template<typename _Tp, typename _Alloc>
typename vector<_Tp, _Allo