C++入门-程序员修炼手册-迭代器失效原因分析

C++入门-程序员修炼手册-迭代器失效原因分析,第1张

在我们使用迭代器时,往往需要插入一个数据,或者删除某一个数据。这时我们需要去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位置的指针

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/713484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存