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;
}
相关文章
|
7月前
|
算法 编译器 C++
|
算法 C++ 容器
STL迭代器
STL迭代器
48 0
|
6月前
|
存储 编译器 Linux
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
63 7
|
6月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
60 0
|
6月前
|
编译器 C++ 容器
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
184 0
|
7月前
|
算法 C++ 容器
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
76 0
|
7月前
|
编译器 C++
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
|
存储 Linux 测试技术
vector迭代器失效与深浅拷贝问题
上文我们写了insert的模拟实现,最开始的版本是有许多Bug的,比如迭代器失效,最后经过优化修改实现了insert,这里我们以最初的版本为例,分析并解决迭代器失效问题。如下:
|
算法 安全 Linux
【C++要笑着学】什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷
再讲解函数模板之前先对STL做一个小铺垫,本篇将对STL做一个简单的介绍。
163 1
【C++要笑着学】什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷
|
算法 安全 关系型数据库
深入探究C++中的仿函数和迭代器——提升你的STL技能
作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段&gt;——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 作者主页:热爱编程的小K 专栏链接:c++ 欢迎各位→点赞 + 收藏 + 留言​ 总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 ———————————————— 版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_72157449