list的迭代器失效(erase)
此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器指向的节点无效,即该节点被删除了。因为list的底层结构为带头节点的双向循环链表,因此在list中进行插入的时候是不会导致list的迭代器失效的,只有在删除的时候才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
void TestListIterator()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list<int> l(arr, arr + sizeof(arr) / sizeof(arr[0]));
auto it = l.begin();
while (it != l.end())
{
// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值
l.erase(it);
++it;
}
}
//改正
void TestListIterator()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list<int> l(arr, arr + sizeof(arr) / sizeof(arr[0]));
auto it = l.begin();
while (it != l.end())
{
l.erase(it++);//it = l.erase(it);
}
}