vector(上):C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用-CSDN博客

vector(中):C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现-CSDN博客

目录

一、vector的迭代器失效问题的本质

二、vector迭代器失效的原因

1、引起底层空间改变的操作

2、进行指定元素删除的时候—erase

3、在其他编译环境下的失效情况

4、string的迭代器失效

三、vector迭代器失效的解决方法

四、总结


前言:

一、vector的迭代器失效问题的本质

二、vector迭代器失效的原因

vector容器可能会发生迭代器失效的操作有以下几种

1、引起底层空间改变的操作

例如:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v{ 1,2,3,4,5,6 };
	auto it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}
对于这样一个程序,我们定义了一个v,并用迭代器来实现全部访问,运行结果如下:
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP
例如(错误示范):
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v{ 1,2,3,4,5,6 };
	auto it = v.begin();
	v.resize(100, 8);            //这里会扩容
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

运行结果:C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

2、进行指定元素删除的时候—erase

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

代码实例:

#include <iostream>
using namespace std;
#include <vector>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	// 使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	// 删除pos位置的数据,导致pos迭代器失效。
	v.erase(pos);
	cout << *pos << endl; // 此处会导致非法访问
	return 0;
}

运行结果:

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

3、在其他编译环境下的失效情况

4、string的迭代器失效

代码实例:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s("hello");
	auto it = s.begin();

	// 放开之后代码会崩溃,因为resize到20会string会进行扩容
	// 扩容之后,it指向之前旧空间已经被释放了,该迭代器就失效了
	// 后序打印时,再访问it指向的空间程序就会崩溃
	//s.resize(20, '!');

	while (it != s.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;
	it = s.begin();
	while (it != s.end())
	{
		it = s.erase(it);
		// 按照下面方式写,运行时程序会崩溃,因为erase(it)之后
		// it位置的迭代器就失效了
		// s.erase(it);
		++it;
	}
}

运行结果:

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

三、vector迭代器失效的解决方法

例如1中的:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v{ 1,2,3,4,5,6 };
	auto it = v.begin();
	v.resize(100, 8);        //这里会扩容
	it = v.begin();          //使用前重新赋值
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

运行结果:

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

四、总结

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题-LMLPHP

感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

05-24 00:34