VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 223|回复: 3

[已解决]list容器删除问题

[复制链接]
53_avatar_middle
最佳答案
2 
在线会员 发表于 2019-11-19 22:07:28 | 显示全部楼层 |阅读模式
有一下一段代码:
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main(){
        int a[]={1,3,5,4,3,5,4,7,6,4};
        list<int> one(a,a+sizeof(a)/sizeof(int));
       list<int>::iterator t;
      for(t=one.begin();t!=one.end();++t){
      if(*t==3)
     one.erase(t);
    int val=*t;
   cout<<val<<",";
}
cout<<endl;
system("pause");
return 0;
}
以上这段代码是从list中把3的元素删除。但是会出错,编译没有错。大概就是第一个元素可以输出,但在删除第一个元素为3的时候,循环就会出错。请求解答。
最佳答案
01_avatar_small
2019-11-20 10:44:59
这个就是《实用C++》第49课 C++容器之链表list② 的课后作业题吧?

  1. #include<iostream>
  2. #include<vector>
  3. #include<list>
  4. using namespace std;

  5. int main()
  6. {
  7.         int a[] = { 1, 3, 5, 4, 3, 5, 4, 7, 6, 4 };
  8.         list<int> one(a, a + sizeof(a) / sizeof(int));
  9.         list<int>::iterator t;
  10.         for (t = one.begin(); t != one.end();)
  11.         {
  12.                 int val = *t;
  13.                 cout << val << ",";

  14.                 if (*t == 3)
  15.                 {
  16.                         t = one.erase(t);
  17.                 }
  18.                 else
  19.                         ++t;
  20.         }
  21.         cout << endl;
  22.         system("pause");
  23.         return 0;
  24. }
复制代码




上一篇:为什么if条件判断中两个不等的值判断相等会通过执行
下一篇:研究Ollydbg ClistCtrl 算法显示问题
01_avatar_middle
最佳答案
39 
online_admins 发表于 2019-11-20 10:44:59 | 显示全部楼层    本楼为最佳答案   
bestAnswer
这个就是《实用C++》第49课 C++容器之链表list② 的课后作业题吧?

  1. #include<iostream>
  2. #include<vector>
  3. #include<list>
  4. using namespace std;

  5. int main()
  6. {
  7.         int a[] = { 1, 3, 5, 4, 3, 5, 4, 7, 6, 4 };
  8.         list<int> one(a, a + sizeof(a) / sizeof(int));
  9.         list<int>::iterator t;
  10.         for (t = one.begin(); t != one.end();)
  11.         {
  12.                 int val = *t;
  13.                 cout << val << ",";

  14.                 if (*t == 3)
  15.                 {
  16.                         t = one.erase(t);
  17.                 }
  18.                 else
  19.                         ++t;
  20.         }
  21.         cout << endl;
  22.         system("pause");
  23.         return 0;
  24. }
复制代码
53_avatar_middle
最佳答案
2 
ico_lz  楼主| 发表于 2019-11-20 11:14:15 | 显示全部楼层
admin 发表于 2019-11-20 10:44
这个就是《实用C++》第49课 C++容器之链表list② 的课后作业题吧?

我想问一下,我原本的代码,是因为删除的时候把迭代器的指针指向的地址一起删除了,然后没有给迭代器再赋值,所以进入下一个循环的时候,迭代器没有指向地址,所以判断的时候出错了是吗?
01_avatar_middle
最佳答案
39 
online_admins 发表于 2019-11-20 12:42:12 | 显示全部楼层
nwm 发表于 2019-11-20 11:14
我想问一下,我原本的代码,是因为删除的时候把迭代器的指针指向的地址一起删除了,然后没有给迭代器再赋 ...

可以这样理解,本身迭代器指向的元素已经被删除了,所以再进行++的时候肯定就是未定义的行为
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-11-26 14:08

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表