问题描述:在forward_list的这个容器中,没有erase接口,只提供了erase_after这个接口。其中erase _after(p)为删除迭代器p指向的位置之后的一个元素。那么为什么不能直接删除当前迭代器指向的元素呢。
首先找到STL中slist.h,可以看到
iterator erase_after(iterator __pos) {
return iterator((_Node*) this->_M_erase_after(__pos._M_node));
}
于是转到相应的函数
_Slist_node_base* _M_erase_after(_Slist_node_base* __pos)
{
_Slist_node<_Tp>* __next = (_Slist_node<_Tp>*) (__pos->_M_next);
_Slist_node_base* __next_next = __next->_M_next;
__pos->_M_next = __next_next;
destroy(&__next->_M_data);
_M_put_node(__next);
return __next_next;
}
这段代码大概的意思就是
// 伪代码
node* next = cur->next;
node* next_next = next->next;
delete(next);
cur->next = next_next
也就是说,为了保持list的连接,需要知道当前被删除的节点的前驱,如果直接删除当前节点,也就是erase(p),连接性就被破坏了。当然,也可以在设计迭代器时定义一个prev变量保存当前迭代器的前驱(逃)。