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++中的模版双向链表进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于C++的重载运算符和重载函数

    关于C++的重载运算符和重载函数

    一般来说,重载运算符在实际的项目开发中会经常的用到,但如果某些自定义类型通过简短几行代码重载一些常用的运算符(如:+-*/),就能让编程工作带来方便,需要的朋友可以参考下本文
    2023-05-05
  • 探讨++i与i++哪个效率更高

    探讨++i与i++哪个效率更高

    i++总是要创建一个临时对象,在退出函数时还要销毁它,而且返回临时对象的值时还会调用其拷贝构造函数
    2013-10-10
  • C语言自定义数据类型的结构体、枚举和联合详解

    C语言自定义数据类型的结构体、枚举和联合详解

    这篇文章主要给大家介绍了关于C语言自定义数据类型的结构体、枚举和联合的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C++实现学生管理系统示例解析

    C++实现学生管理系统示例解析

    这篇文章主要介绍了C++实现学生管理系统示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 基于C语言实现猜数字游戏

    基于C语言实现猜数字游戏

    这篇文章主要为大家详细介绍了基于C语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Qt读写ini文件之QSettings用法

    Qt读写ini文件之QSettings用法

    这篇文章主要为大家介绍了Qt读写ini文件之QSettings的使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 解析Linux下的时间函数:设置以及获取时间的方法

    解析Linux下的时间函数:设置以及获取时间的方法

    本篇文章是对Linux下的时间函数:设置以及获取时间的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于C++中定义比较函数的三种方法小结

    关于C++中定义比较函数的三种方法小结

    下面小编就为大家带来一篇关于C++中定义比较函数的三种方法小结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • C++实现双向链表代码分析

    C++实现双向链表代码分析

    这篇文章主要介绍了C++实现双向链表代码分析,前面文章分析了单向链表,这篇文章就来给大家分享双链表的实现吧,需要的朋友可以参考一下
    2022-03-03

最新评论