免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13625 | 回复: 9
打印 上一主题 下一主题

vector里删除用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-11 23:43 |只看该作者 |倒序浏览
#include<iostream>
#include<vector>
using namespace std;

typedef struct data
{
   int a;
   int b;
}data;

int main()
{
   
   vector< data* > _data;
  
   data *_data1 = new data;
   _data1->a = 1;
   _data1->b = 2;  

   int i;
   for(i=0;i<1;i++)
   {
       _data.push_back(_data1);
   }

   vector<data*>::iterator iter;
  
   for(iter=_data.begin();iter!=_data.end();iter++)
   {
        if( (*iter)->a == 1 )
        {
            _data.erase(iter);    /*删除节点*/
            delete(*iter);           /*delete 空间*/
        }
      
   
   }
   return 0;
}

写了这样一个小程序,_data存了一个动态指针分配的结构体,
然后再把他删除,
运行后发现出现段错误,
这是什么原因啊?

论坛徽章:
0
2 [报告]
发表于 2011-02-12 08:35 |只看该作者
这句
  _data.erase(iter);    /*删除节点*/
            delete(*iter);           /*delete 空间*/

erase后iter是不能再使用的

论坛徽章:
0
3 [报告]
发表于 2011-02-12 13:05 |只看该作者
这句
  _data.erase(iter);    /*删除节点*/
            delete(*iter);           /*delete 空间*/

...
yang_crystal 发表于 2011-02-12 08:35



    这个答案不全。erase后还需要重新计算一下vector的数量的

论坛徽章:
0
4 [报告]
发表于 2011-02-12 13:09 |只看该作者
给你个例子
  1. for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
  2. {
  3.      if( *iter == 3)
  4.           iter = veci.erase(iter);
  5.       else
  6.             iter ++ ;
  7. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-02-12 18:14 |只看该作者
iter 需要重新创建 试试删除完成后 设置成NULL 成不成...

论坛徽章:
0
6 [报告]
发表于 2011-02-12 18:32 |只看该作者
  1. delete(*iter);
复制代码
这句用来干吗

论坛徽章:
0
7 [报告]
发表于 2011-02-12 22:44 |只看该作者
这样试试

  1. for(iter=_data.begin();iter!=_data.end();)
  2.    {
  3.         if( (*iter)->a == 1 )
  4.         {
  5.             delete(*iter);           /*delete 空间*/
  6.              iter = _data.erase(iter);
  7.         }
  8.         iter++;
  9. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-02-14 16:49 |只看该作者
for(iter=_data.begin();iter!=_data.end()
   {
        if( (*iter)->a == 1 )
        {
            delete(*iter);           /*delete 空间*/
            iter = _data.erase(iter);    /*删除节点*/
            
        }else
       {
           iter++;
       }
}

或者

for(int i = _data.size() - 1;i >= 0 ;i--)
   {
        if( _data[i]->a == 1 )
        {
            delete(_data[i]);           /*delete 空间*/
            _data.erase(_data.begin() + i);    /*删除节点*/
            
        }
}

论坛徽章:
1
白羊座
日期:2014-01-14 17:31:01
9 [报告]
发表于 2011-02-15 13:13 |只看该作者
erase之后节点都不在了,再去delete就等于去访问非法内存空间,所以出现段错误

论坛徽章:
0
10 [报告]
发表于 2011-02-16 10:04 |只看该作者
The C++ standard Library一书中有比较详细的说明.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP