迭代器失效问题

发布于:2024-10-09 ⋅ 阅读:(120) ⋅ 点赞:(0)

1.概念

迭代器的底层实际上是一个指针,或者是对指针进行了封装。迭代器失效,实际上就是迭代器对应地址的空间已经释放,但我们仍然去使用,导致程序崩溃。

2.引发底层空间的改变,可能会使迭代器失效(插入数据,reverse,resize都有可能)

例如当我们运行下面的代码时就会报错

vector<int> v1(10, 5);
cout << v1.capacity() << endl;//v1的容量就是10
auto it = v1.begin();
v1.push_back(6);//此时插入就会扩容,就有空间的转移,之前的it就会失效
while (it != v1.end())
{
	cout << *it << " ";
	it++;
}
string s1("claus hello");
cout << s1.capacity();//容量为15
auto it = s1.begin();
s1.reserve(16);//此时空间迁移了,it已经失效了
while (it != s1.end())
{
	cout << *it << " ";
	it++;
}

 

3. erase删除元素后

	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(7);
	//例如我要删掉v1中的全部偶数
	auto it = v1.begin();
	while (it!= v1.end())
	{
		if (*it % 2 == 0)
		{
			v1.erase(it);//erase it位置后,后面的元素会补上来
		}
		it++;//这里++it就会导致漏查,或者结尾的时候会越界。但是由于vs的检查第一次删除后++就会报错
	}

4.解决办法

在迭代器失效后对it重新赋值即可解决问题。

vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
v1.push_back(7);
//例如我要删掉v1中的全部偶数
auto it = v1.begin();
while (it!= v1.end())
{
	if (*it % 2 == 0)
	{
		it = v1.erase(it);
	}
	else
	{
		it++;
	}
}