stl:vector erase 时的元素析构问题

先看一下 /user/include/c++/4.1.2/vector.tcc对 erase的实现

template<typename _Tp,_Alloc>typename vector<_Tp,_Alloc>::iterator
vector<_Tp,_Alloc>::erase(iterator __postion) {
    if (__postion + 1 != end())
        std::copy(__postion + 1, end(), __postion);
    --this->_M_impl._M_finish;
    this->_M_impl.destroy(this->_M_impl._M_finish);
    return __postion;
}

copy是把删除元素位置后面元素向前移位, 然后 --finish把end位向前移动, 这2句都好理解保持内存连续把删除的空位补上同时把队尾往前挪,但是接下来的就很费解了

destory(finish)!!!   
你没看错, 难道不是应该调用被删除元素的析构 比如 destory(postion)这样, 不放心,再看看destory的实现吧

destory(pointer __p) {__p->_Tp();}
确实是调用了元素的析构。

于是如下代码的测试情况就理所应当了:

void test(){
	struct role{
		string name;
		role(const char* n) : name(n) {}
		~role() { printf("%s has been remove");}
	}; 	
	role r1("小李"), r2("小强") ,r3("小狗"), r4("小明");

	typedef std::vector<role> RoleVec;	
	RoleVec rvec;  

	rvec.push_back(r1);rvec.push_back(r2);
        rvec.push_back(r3);rvec.push_back(r4);
	RoleVec::iterator iter = rvec.begin();
	RoleVec::iterator iend = rvec.end();
	
	for(;iter != iend;++iter)	{
		if((*iter).name.compare("小强") == 0)		{
			rvec.erase(iter); break;
		}
	}
}

--------------

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值