我在上一篇博客讲过vector迭代器失效的原因,迭代器类似于指针,其实所谓的迭代器失效就是指针指向的内容已经失效,所以因为list的空间不连续性,list迭代器失效场景便只有如下情况。
一、迭代器失效的场景
list迭代器在删除结点时会发生失效,即迭代器指向的结点被删除了,此时迭代器指向了一块被删除的区域,显然这个迭代器已经失去了意义。不过,幸运的是,因为list的空间不连续性,只有被删除结点的迭代器发生了失效,其他的迭代器依旧可以使用。如下:
void TestListIterator()
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list<int> l(array, array + sizeof(array) / sizeof(array[0]));
auto it = l.begin();
auto test = ++it;
l.erase(it); //这个时候it已经失效
*test = 666;//其他迭代器依旧可以使用
cout << *test << endl;
}
运行结果:
二、迭代器失效问题的解决
既然list迭代器失效的原因在于指向的内容已经被删除失效了,那么想要避免这种失效,我们只要将失效的迭代器更新为有效的迭代器即可,如vector迭代器失效的解决方法相似,不过,对于list,有一些特殊的迭代器失效的解决方法技巧,如下:
// 改正
void TestListIterator()
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list<int> l(array, array+sizeof(array)/sizeof(array[0]));
auto it = l.begin();
while (it != l.end())
{
l.erase(it++); -------第一种技巧
// it = l.erase(it);--第二种技巧
}
}
如此,list迭代器失效的问题解决,不得不说这个后置++很优雅。