我们现要简单的理解一下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;
}
}

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

被折叠的 条评论
为什么被折叠?



