与数组相比,list的迭代器
数组是一段连续的空间,迭代器是内置类型的原生指针,迭代器++或者--就可以控制迭代器的移动,插入时可能会发生扩容,而一旦扩容,迭代器就会失效。(迭代器it依然指向之前空间的位置,但那片空间已经被释放,所以迭代器变成野指针)。
list是一个链表结构,它是有一个个单独的结点组成,插入或者删除不会出现空间开辟放大的问题。迭代器it依然指向那个位置,迭代器不会失效,但会返回插入结点的迭代器。但erase()会使it的迭代器失效,毕竟那个结点都被释放了。因此在删除数据结点时,返回下一个结点的迭代器
iterator insert(iterator pos, const T& x)
{
Node* newnode = new Node(x);
Node* cur = pos._node;
Node* prev = cur->_prev;
prev->_next = newnode;
newnode->_prev = prev;
newnode->_next = cur;
cur->_prev = newnode;
return iterator(newnode);
}
iterator erase(iterator pos)
{
assert(pos != end());
Node* cur = pos->_node;
Node* prev = cur->_prev;
Node* next = cur->_next;
prev->_next = next;
next->_prev = prev;
delete cur;
return iterator(next);
}