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;
}
}
这代码好像不会崩溃
{
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之后要接收返回值,重新赋值给迭代器:
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,等也可能会,让代器失效
此时,迭代器和容器的内容不再关联。
一种是假失效,此时迭代器,和容器内容依然关联。
但是容器以及他的迭代器,实现,属于黑盒
容器的内部状态,不应该跟迭代器的使用状态,相关联
因此,一切修改容器容量,大小的,,重新分配容器内存的操作,都会使得容器的迭代器失效(可能是真失效,也可能是假失效)
真失效后,迭代器成为野指针一样的东西
假失效,迭代器暂时,还可使用,但是迭代器的真假失效,是程序员不可控的。
原因是,容器的实现,并不是完全一致的,而是不同编译器的实现,可能就不同
因此,容器,迭代器的使用,不应该关心,容器和迭代器的实现细节。
因此,只要有容器 容量,大小变更,以及重新分配容器内存的操作,迭代器就视为失效了。
此时必须及时更新迭代器。
删除元素,插入元素,等行为都可能让迭代器失效
resize,等也可能会,让代器失效
1
push_back,pop_back,insert,resize,erase等都可能,让迭代器失效
10
erase 直接用返回值更新
insert 也是
也可以重新开始遍历容器
resize
push_back
pop_back
最好重新开始遍历
总之,在可能会调整容器的结构的时候,不要试图永久保存iterator 供以后使用
iterator 应该在算法内部处理,或仅仅返回iterator 供某个函数使用。
iterator 仅仅是访问容器的工具。
应该尽快使用
多线程的时候,iterator 也不是很适合在线程之间传递
insert 也是
也可以重新开始遍历容器
resize
push_back
pop_back
最好重新开始遍历
总之,在可能会调整容器的结构的时候,不要试图永久保存iterator 供以后使用
iterator 应该在算法内部处理,或仅仅返回iterator 供某个函数使用。
iterator 仅仅是访问容器的工具。
应该尽快使用
多线程的时候,iterator 也不是很适合在线程之间传递