在我们使用迭代器时,往往需要插入一个数据,或者删除某一个数据。这时我们需要去find的这个元素。这时我们就会使用迭代器去寻找元素删除或插入
如下所示:
情况1:pos指针意义改变int main()
{
string s1("123456789");
size_t pos=s1.find('8');
//8的前面插入H
s1.insert(pos,1 ,'H');
Printsting(s1);
//删除8
s1.erase(pos,1);
Printsting(s1);
return 0;
}
本来是想删除8,但我们发现却把H删除了,这是为什么呢,
通过分析我们可以知道,插入数据以后,pos指向的位置为H,pos的指针指向发生了改变,原来的pos就失效了(未开空间的情况下).
解决方案:重新获取当前pos的位置,就会避免迭代器失效的问题。 情况2:扩容导致pos指针空间地址发生改变,产生了pos野指针vectorv1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
cout<::iterator pos = find(v1.begin(), v1.end(), 3);
//v1.insert(pos, 5);
//Printsting(v1);
//删除pos位置的值
//v1.erase(pos);
return 0;
此时容量为4,当我们插入数据后容量变成6,开辟了新的空间
当我们再去删除pos位置的值时,会发现此时编译不过去,发生了编译错误,这个就是由于扩容导致pos失效,失效具体原因是由于insert出现增容以后,pos指向的位置空间已经被释放了,pos已经成为了野指针。
解决方案:在删除元素之前,重新获取当前pos位置的指针
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)