请教什么是迭代器失效

C++语言 码拜 8年前 (2016-05-20) 1224次浏览
void vectorTest()
{
vector<int> container;
for (int i = 0; i < 10; i++)
{
container.push_back(i);
}
vector<int>::iterator iter;
for (iter = container.begin(); iter != container.end(); iter++)
{
if (*iter > 3)
container.erase(iter);
}
for (iter = container.begin(); iter != container.end(); iter++)
{
cout<<*iter<<endl;
}
}
这代码好像不会崩溃
解决方案

2

删除元素不会导致迭代器失效
在添加元素时,假如空间不够,会重新分配更大内存,同时复制原来内容到新内存,这就使指向原来内存的迭代器失效了

20

你让第一个for循环,循环11次就会崩
for (int i = 0; i < 11; i++)
正确的写法,应该是在erase之后要接收返回值,重新赋值给迭代器:

#include<iostream>
#include<vector>
using namespace std;
void vectorTest()
{
	vector<int> container;
	for (int i = 0; i < 11; i++)
	{
		container.push_back(i);
	}
	vector<int>::iterator iter;
	for (iter = container.begin(); iter != container.end(); )
	{
		if (*iter > 3)
			iter = container.erase(iter);
		else
			iter++;
	}
	for (iter = container.begin(); iter != container.end(); iter++)
	{
		cout << *iter << endl;
	}
}
int main() {
	vectorTest();
	return 0;
}

1

删除和增加元素会使迭代器失效。需要重新给迭代器赋予新值。

1

例如你面前站了一排小朋友,你从左往右逐个数人数,1、2、3、……还没数完的时候,左边走了或插进来人,此时你正数的数就不对了。即迭代器失效了。
请教什么是迭代器失效

1

内部实现机制就是当内部元素添加或删除后,  迭代器会被重新分配.   相当于你拿了一个野指针.

15

迭代器失效,分为两种情况,一种是真失效。
此时,迭代器和容器的内容不再关联。
一种是假失效,此时迭代器,和容器内容依然关联。
但是容器以及他的迭代器,实现,属于黑盒
容器的内部状态,不应该跟迭代器的使用状态,相关联
因此,一切修改容器容量,大小的,,重新分配容器内存的操作,都会使得容器的迭代器失效(可能是真失效,也可能是假失效)
真失效后,迭代器成为野指针一样的东西
假失效,迭代器暂时,还可使用,但是迭代器的真假失效,是程序员不可控的。
原因是,容器的实现,并不是完全一致的,而是不同编译器的实现,可能就不同
因此,容器,迭代器的使用,不应该关心,容器和迭代器的实现细节。
因此,只要有容器 容量,大小变更,以及重新分配容器内存的操作,迭代器就视为失效了。
此时必须及时更新迭代器。
删除元素,插入元素,等行为都可能让迭代器失效
resize,等也可能会,让代器失效

1

push_back,pop_back,insert,resize,erase等都可能,让迭代器失效

10

erase 直接用返回值更新
insert 也是
也可以重新开始遍历容器
resize
push_back
pop_back
最好重新开始遍历
总之,在可能会调整容器的结构的时候,不要试图永久保存iterator 供以后使用
iterator 应该在算法内部处理,或仅仅返回iterator 供某个函数使用。
iterator 仅仅是访问容器的工具。
应该尽快使用
多线程的时候,iterator 也不是很适合在线程之间传递

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教什么是迭代器失效
喜欢 (0)
[1034331897@qq.com]
分享 (0)