迭代器的失效

我们现要简单的理解一下std里面的迭代器,我们应该如何理解了。凭我自己最简单浅显目前的理解是迭代器就是提供遍历std容器的一个指针
在访问vector时候迭代器就像是一个连续的有地址的空间
在这里插入图片描述
假设末尾迭代器上我们在vector迭代器上删除pos位置,那么我们继续向后遍历没有了pos这个地址后面的地址空间就无法推到了。总而言之了,我脑海当中是这么想的。

  • 好了,具体看一下吧,迭代器失效,我感觉耗时应该注意就好了。如果用迭代器去遍历容器有时候真的稍不注意就出错了,而且半天说不定还找不到,反正要注意的。
    看一些迭代器失效的场景吧
#include <iostream>
#include <algorithm>
#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; // 此处会导致非法访问

	// 在pos位置插入数据,导致pos迭代器失效。 
	// insert会导致迭代器失效,是因为insert可  
	// 能会导致增容,增容后pos还指向原来的空间,而原来的空间已经释放了。   
	pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 30);
	cout << *pos << endl; // 此处会导致非法访问

	return 0;
}

在这里插入图片描述
崩了

int main() {
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));

	// 实现删除v中的所有偶数  
	// 下面的程序会崩溃掉,如果是偶数,erase导致it失效 
	// 对失效的迭代器进行++it,会导致程序崩溃   
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
			v.erase(it);

		++it;
	}
}

在这里插入图片描述
又崩了
增容·,以及容器成员的改变都要注意一下迭代器失效,我是这么理解的,不知道是不是理解的有点浅显

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值