STL模板库之迭代器失效问题及解决方案

简介: STL模板库作为C++语言里一个重要的板块,在实际的开发中能极大的提高我们的开发效率,其中有一个问题另很多初学的同学感到头疼,那便是迭代器失效问题,本文将从校招的角度去讲解STL模板库之迭代器失效问题及解决方案。

1. 迭代器失效的三种情况:

       (1)当容器调用erase方法的时候,会造成删除点到容器末尾所有元素的迭代器都失效了。

       (2)当容器调用insert方法的时候且不造成扩容情况,会造成插入点到容器末尾所有元素的迭代器都失效了。

       (3)当容器调用insert方法的时候并且造成扩容的情况,会造成首元素到容器末尾所有元素的迭代器都失效了。



2. 如何解决容器迭代器失效问题?

       对插入/删除点的迭代器进行更新。


下面我们将通过代码来加深对上述知识的理解。

#include <iostream>#include <vector>usingnamespacestd;
intmain()
{
vector<int>vec;
for (inti=0; i<20; i++)
    {
vec.push_back(rand() %100+1);
    }
cout<<"删除前打印:"<<endl;
for (auto&e : vec) // 删除前打印    {
cout<<e<<" ";
    }
cout<<endl;
//删除所有偶数autoit=vec.begin();
while (it!=vec.end())
    {
if (*it%2==0)
        {
it=vec.erase(it);// 此时删除点到容器末尾的所有迭代器失效,需要对迭代器进行更新操作,//观察erase方法可以发现它可以返回一个的是下一个有效迭代器的位置,所以我们可以将erase(it)对it进行重新赋值以达到更新it的目的!        }
else        {
it++;
        }
    }
cout<<"删除后打印:"<<endl;
for (auto&e : vec) // 删除后打印    {
cout<<e<<" ";
    }
cout<<endl;
//在大于5的数字前增加一个数字6it=vec.begin();
while (it!=vec.end())
    {
if (*it>5)
        {
it=vec.insert(it,6);
it++;
it++;
        }
else        {
it++;
        }
    }
cout<<"增加后打印:"<<endl;
for (auto&e : vec) // 删除后打印    {
cout<<e<<" ";
    }
cout<<endl;
return0;
}
相关文章
|
4月前
|
存储 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 << " "; }`
36 2
|
3月前
|
存储 算法 C语言
STL标准模板库《实战案例汇总》
STL标准模板库《实战案例汇总》
47 1
|
3月前
|
编译器 C++ 容器
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
98 0
|
4月前
|
存储 算法 C++
高效利用C++ STL库:标准模板库的使用技巧
本文介绍了C++ STL(标准模板库)的高效使用技巧,包括选择合适的容器类型、使用`emplace_back`而非`push_back`、预分配容器空间和范围for循环遍历容器。此外,还讨论了STL算法的运用,如用算法替代手动循环、使用lambda表达式和进行容器操作。通过这些技巧,开发者可以提升C++代码的性能和可读性。
|
4月前
|
编译器 C++
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
|
算法 测试技术 C++
10.1 C++ STL 模板适配与迭代器
STL(Standard Template Library)标准模板库提供了模板适配器和迭代器等重要概念,为开发者提供了高效、灵活和方便的编程工具。模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。适配器与迭代器两者的紧密配合,使得开发者能够高效地处理容器中的元素,提高了代码的复用性和可维护性。
43 0
|
4月前
|
存储 算法 编译器
|
4月前
|
C++ 容器
【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)
【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)
|
存储 算法 程序员
C++STL学习笔记(第一篇:stl是什么?为什么要学习stl?迭代器在stl中扮演着什么角色?)
C++STL学习笔记(第一篇:stl是什么?为什么要学习stl?迭代器在stl中扮演着什么角色?)
452 1
|
人工智能 算法 搜索推荐