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

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

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

本来是想删除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;

C++入门-程序员修炼手册-迭代器失效原因分析_第2张图片

 此时容量为4,当我们插入数据后容量变成6,开辟了新的空间

C++入门-程序员修炼手册-迭代器失效原因分析_第3张图片

 当我们再去删除pos位置的值时,会发现此时编译不过去,发生了编译错误,这个就是由于扩容导致pos失效,失效具体原因是由于insert出现增容以后,pos指向的位置空间已经被释放了,pos已经成为了野指针。

C++入门-程序员修炼手册-迭代器失效原因分析_第4张图片

 解决方案:在删除元素之前,重新获取当前pos位置的指针

C++入门-程序员修炼手册-迭代器失效原因分析_第5张图片

 

你可能感兴趣的:(C++,c++)