C++ STL list 遍历删除出错解决方案

 更新时间:2016年12月12日 11:51:10   作者:zhouyongku  
这篇文章主要介绍了C++ STL list 遍历删除出错解决方案的相关资料,这里对出错进行分析,并给出正确的解决方法,需要的朋友可以参考下

C++ STL list 遍历删除崩溃

错误用法一

下面这种用法会在for的地方崩溃,分析 第一次for循环的时候 it=0,当t.erase(it)执行完成之后 it就变成了 -17891602
表明it不能再作为迭代器进行运算,自然会报错。

#include <map> 
#include <list> 
using namespace std; 
typedef std::list<int > TESTLIST; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  TESTLIST t; 
  for (int i = 0; i < 10;i++) 
  { 
    t.push_back(i); 
  } 
 
  for (TESTLIST::iterator it = t.begin(); it != t.end();) 
  { 
    t.erase(it); 
    it++; 
  } 
 
  return 0; 
} 

错误用法二

下面这种用法出现的错误与错误一相同

#include <map> 
#include <list> 
using namespace std; 
typedef std::list<int > TESTLIST; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  TESTLIST t; 
  for (int i = 0; i < 10;i++) 
  { 
    t.push_back(i); 
  } 
 
  for (TESTLIST::iterator it = t.begin(); it != t.end();it++) 
  { 
    t.erase(it); 
  } 
 
  return 0; 
} 

错误用法三

下面这种用法以为不it++就不会有事,其实他们的错误都一样,那就是t.erase(it)之后 it已经是非迭代量,自然不能作为迭代操作

#include "stdafx.h" 
 
#include <map> 
#include <list> 
using namespace std; 
typedef std::list<int > TESTLIST; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  TESTLIST t; 
  for (int i = 0; i < 10;i++) 
  { 
    t.push_back(i); 
  } 
 
  for (TESTLIST::iterator it = t.begin(); it != t.end();) 
  { 
    t.erase(it); 
  } 
 
  return 0; 
} 

 正确用法

#include <map> 
#include <list> 
using namespace std; 
typedef std::list<int > TESTLIST; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  TESTLIST t; 
  for (int i = 0; i < 10;i++) 
  { 
    t.push_back(i); 
  } 
 
  for (TESTLIST::iterator it = t.begin(); it != t.end();) 
  { 
    t.erase(it++); 
  } 
 
  return 0; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C++中访问权限的示例详解

    C++中访问权限的示例详解

    C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限(也称为可见性),下面这篇文章主要给大家介绍了关于C++中访问权限的相关资料,需要的朋友可以参考下
    2021-07-07
  • Win10+VS2017新CUDA项目配置教程

    Win10+VS2017新CUDA项目配置教程

    这篇文章主要为大家详细介绍了Win10+VS2017新CUDA项目配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C语言求2的n次方多种方法总结

    C语言求2的n次方多种方法总结

    这篇文章主要给大家介绍了关于C语言求2的n次方多种方法的相关资料,求2的N次幂是一个常用的功能,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • C++实现LeetCode(88.混合插入有序数组)

    C++实现LeetCode(88.混合插入有序数组)

    这篇文章主要介绍了C++实现LeetCode(88.混合插入有序数组),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言中宏定义的妙用方法

    C语言中宏定义的妙用方法

    今天小编就为大家分享一篇关于C语言中宏定义的妙用方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++简易通讯录系统实现流程详解

    C++简易通讯录系统实现流程详解

    这篇文章主要为大家介绍了C语言简易版通讯录的具体实现流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Qt实现无边框窗口的示例代码

    Qt实现无边框窗口的示例代码

    本文主要介绍了Qt实现无边框窗口的示例代码,主要包括鼠标光标在不同区域的变化,关闭拖动窗口,窗口支持任意拉伸等,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C++浅析程序中内存的分布

    C++浅析程序中内存的分布

    这篇文章主要介绍了C++内存分布及用法,从内存的基础概念到内存分配进行了讲解,内存是我们开发中最重要的一部分,往往逻辑上的错误就会造成内存泄漏,导致程序无法运行,下面我们就来了解文章对该内容的详细介绍
    2022-08-08
  • C++ OpenCV模拟实现微信跳一跳

    C++ OpenCV模拟实现微信跳一跳

    这篇文章主要介绍了使用C++和OpenCV模拟实现微信跳一跳功能,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 基于Matlab绘制超绚丽的烟花的过程详解

    基于Matlab绘制超绚丽的烟花的过程详解

    这篇文章主要为大家介绍了如何利用Matlab绘制超绚丽的烟花,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-02-02

最新评论