【C++】-- STL之vector详解(三)

简介: 【C++】-- STL之vector详解

三、迭代器失效

1.迭代器失效的情况

(1)在v中插入元素1,2,3,4,5后,在3前面插入30

1.     vector<int> v;
2. 
3. //插入6个int元素
4.     v.push_back(1);
5.     v.push_back(2);
6.     v.push_back(3);
7.     v.push_back(4);
8.     v.push_back(5);
9. 
10. //在3的前面插入30
11.     vector<int>::iterator pos = find(v.begin(), v.end(), 3);//查找3的位置
12. if (pos != v.end())
13.     {
14.         v.insert(pos, 30);
15.     }
16. PrintVector(v);

但是当删除30时,执行如下代码,程序崩了

1.     v.erase(pos);
2. PrintVector(v);

这是因为先查找3,找到后挪动3的位置及之后的数据,插入30,3已经挪走了,但pos还指向原来的位置,也就是现在30的位置。再erase的时候,pos失效了,因为pos的意义变了,不再指向3了,所以程序崩溃。

(2)如下代码当删除所有偶数时,程序会崩

1.     vector<int> v;
2.     v.push_back(1);
3.     v.push_back(2);
4.     v.push_back(3);
5.     v.push_back(4);
6.     v.push_back(5);
7.     v.push_back(6);
8. 
9. //删除v中所有的偶数
10.     vector<int>::iterator it = v.begin();
11. while (it != v.end())
12.     {
13. if (*it % 2 == 0)
14.         {
15.             v.erase(it);
16.         }
17.         it++;
18.     }
19. 
20. PrintVector(v);

执行过程:end不固定,删除数据后,每次都会去重新拿取,end是最后一个数的下一个位置

而且执行过程中,由于删除数据后,it++了,迭代器的意义变了,所以结果一定不正确。

迭代器失效有两种情况:

(1)pos意义变了,插入数据以后,pos不再指向3,而是指向30,导致erase(pos)没有达到删除3的目的,反而删除的是30

(2)程序可能崩溃,pos变成了野指针

2.如何解决迭代器失效

在使用迭代器之前,对迭代器重新赋值

对于(1)使用迭代器之前,对迭代器重新赋值

1.     vector<int> v;
2. 
3. //插入6个int元素
4.     v.push_back(1);
5.     v.push_back(2);
6.     v.push_back(3);
7.     v.push_back(4);
8.     v.push_back(5);
9. 
10. //在3的前面插入30
11.     vector<int>::iterator pos = find(v.begin(), v.end(), 3);
12. if (pos != v.end())
13.     {
14.         v.insert(pos, 30);
15.     }
16. 
17. PrintVector(v);
18. 
19. //使用迭代器之前,对迭代器重新赋值
20.     pos = find(v.begin(), v.end(), 3);
21. //然后再使用迭代器
22. if (pos != v.end())
23.     {
24.         v.erase(pos);
25.     }
26. PrintVector(v);

对于(2)每次使用迭代器之前,对迭代器重新赋值,当it为偶数的位置时,删除偶数后,it不用++

1.     vector<int> v;
2.     v.push_back(1);
3.     v.push_back(2);
4.     v.push_back(3);
5.     v.push_back(4);
6.     v.push_back(5);
7.     v.push_back(6);
8. 
9. //删除v中所有的偶数
10.     vector<int>::iterator it = v.begin();
11. while (it != v.end())
12.     {
13. if (*it % 2 == 0)
14.         {
15. //每次使用迭代器之前,对迭代器重新赋值
16.             it = v.erase(it);//删除偶数后,it不用++
17.         }
18. else
19.         {
20.             it++;//奇数,it++
21.         }
22. 
23.     }
24. 
25. PrintVector(v);

相关文章
|
15天前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
54 5
|
14天前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
15 1
|
15天前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
37 1
|
24天前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
24天前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
17天前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
14 0
|
19天前
|
算法 C++ 容器
C++之打造my vector篇(下)
C++之打造my vector篇(下)
25 0
|
19天前
|
存储 编译器 C++
C++之打造my vector篇(上)
C++之打造my vector篇(上)
25 0
|
24天前
|
算法 C++ 容器
【C++】—— vector使用
【C++】—— vector使用
|
25天前
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
18 0