vector之二(迭代器失效与解决)
Posted yumoz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vector之二(迭代器失效与解决)相关的知识,希望对你有一定的参考价值。
vector迭代器失效
迭代器的主要作用就是让算法不用关心低层数据结构,其低层实际上就是一个指针,或者是对指针进行了封装。所以迭代器失效就是:迭代器低层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序奔溃。
下面从几个方面分析vector迭代器失效的几种可能:
情况一(pos含义改变)
会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。
如上图,pos在插入100之前确定是指向3的,但是插入100之后,pos不在指向3,而是指向100,所以erase删除时,删除的是100,不是3;
情况二(野指针)
有可能导致野指针,程序奔溃;
上图所示是pos索引超过范围。
上图所示的迭代器失效是因为insert后出现了增容现象,pos指向空间位置已经释放,pos称为野指针,所以会导致程序奔溃。
迭代器失效修正
一般来说,迭代器失效是因为指针指向问题引起,所以在使用迭代器指针时,对迭代器重新赋值就可以解决迭代器失效的问题。
下面给出删除偶数中迭代器失效的解决办法:(只需要判断偶数时删除,不对迭代器++,奇数时对迭代器++处理)
void TestOfVector2()
{
vector<int> v;
for (int i = 0; i < 10; ++i)
{
v.push_back(i);
}
PrintVector(v);
//auto it = v.begin();
vector<int>::iterator it = v.begin();
while (it != v.end())
{
//vector迭代器失效
/*if (*it % 2 == 0)
{
it = v.erase(it);
}
++it;*/
//迭代器失效解决办法
if (*it % 2 == 0)
{
it = v.erase(it);
}
else
{
++it;
}
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
}
总结
vector迭代器失效一般有两种,其一是pos指针含义的改变,其二是pos称为野指针。总之都是迭代器低层指针指向引起的问题。
以上是关于vector之二(迭代器失效与解决)的主要内容,如果未能解决你的问题,请参考以下文章