先看一下 /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;
}
}
}
--------------