【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);

相关文章
|
10天前
|
存储 C++ 容器
C++STL(标准模板库)处理学习应用案例
【4月更文挑战第8天】使用C++ STL,通过`std:vector`存储整数数组 `{5, 3, 1, 4, 2}`,然后利用`std::sort`进行排序,输出排序后序列:`std:vector<int> numbers; numbers = {5, 3, 1, 4, 2}; std:sort(numbers.begin(), numbers.end()); for (int number : numbers) { std::cout << number << " "; }`
17 2
|
21天前
|
存储 C++ 容器
【C++】vector的底层剖析以及模拟实现
【C++】vector的底层剖析以及模拟实现
|
24天前
|
存储 算法 测试技术
C++:Vector的使用
C++:Vector的使用
|
27天前
|
存储 算法 C++
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
22 1
|
29天前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
本文介绍了C++的STL组件`std::priority_queue`,它是一个容器适配器,实现优先队列数据结构,通常基于堆实现。文章讨论了优先队列的基本概念、特点和底层堆结构,强调了其自动排序和优先级最高元素的访问。还展示了如何定义、插入、访问和移除元素,以及自定义比较函数。此外,提供了模拟实现`priority_queue`的代码示例,探讨了仿函数的作用,包括默认的`std::less`和自定义比较函数。文章鼓励读者进一步探索C++的优先队列及其应用。
25 3
|
11天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
47 1
|
11天前
|
存储 编译器 C++
【C++初阶】10. vector的使用及模拟实现
【C++初阶】10. vector的使用及模拟实现
49 1
|
22天前
|
算法 C++ 容器
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
|
22天前
|
C++ 容器
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
|
24天前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— map & multimap (STL)
之前我们学习了C++的基础和一些概念,现在将探讨重要的STL组件——map与multimap。map是关联容器,提供有序键值对存储,基于红黑树,支持高效查找、插入和删除。每个键唯一对应一个值。multimap则允许键的重复。两者都提供迭代器支持,但map的键是唯一的,而multimap允许键重复,插入和查找效率不同。更多详情,请查阅官方文档。祝学习愉快!
12 0