免费注册 查看新帖 |

Chinaunix

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

删除数组问题,请大家进来分析一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-23 11:49 |只看该作者 |倒序浏览
实现删除数组的奇数下标数

  1. #include <iostream>
  2. #include <list>;
  3. using namespace std;
  4. int main(){
  5. int a[]={0,1,1,2,3,5,8,13,21,55,89};
  6. list<int>v(a,a+11);

  7. list<int>::iterator it=v.begin ();

  8. for(;it!=v.end ();it++)
  9. {if((*it%2)!=0)
  10.        v.erase (it);
  11. }
  12. for(it=v.begin ();it!=v.end();++it)
  13.   cout<<*it<<"\n";
  14. return 0;
  15. }

复制代码

执行时总是出现错误关闭应该是erase,但不知道是怎么错的,谢谢!

论坛徽章:
0
2 [报告]
发表于 2006-04-23 18:34 |只看该作者
a[]共有11个成员,最后一个应该是a[10]

论坛徽章:
0
3 [报告]
发表于 2006-04-23 19:04 |只看该作者

实现删除数组的奇数下标数

#include <iostream>
#include <list>
using namespace std;
int main(){
int a[]={0,1,1,2,3,5,8,13,21,55,89};
list<int>v(a,a+11);

list<int>::iterator it=v.begin ();

for(;it!=v.end ();it++)
{
        static bool r=false;
        r=!r;
        if(r)
        {
                continue;
        }
       v.erase (it);
}
for(it=v.begin ();it!=v.end();++it)
  cout<<*it<<"\n";
return 0;
}

论坛徽章:
0
4 [报告]
发表于 2006-04-23 20:49 |只看该作者
原帖由 litzhang 于 2006-4-23 19:04 发表
#include <iostream>
#include <list>
using namespace std;
int main(){
int a[]={0,1,1,2,3,5,8,13,21,55,89};
list<int>v(a,a+11);

list<int>::iterator it=v.begin ();

f ...

不行的。

论坛徽章:
0
5 [报告]
发表于 2006-04-23 20:55 |只看该作者

回复 4楼 yanglinayp 的帖子

#include <iostream>
#include <list>;
using namespace std;
int main(){
int a[]={0,1,1,2,3,5,8,13,21,55,89};
list<int>v(a,a+11);

list<int>::iterator it=v.begin ();

while(it!=v.end ())
{if((*it%2)!=0)    //错误的地方,改后执行正确。
       it=v.erase (it);
else
it++ ;
}
for(it=v.begin ();it!=v.end();++it)
  cout<<*it<<"\n";
return 0;
}
可我不懂为什么v.erase(it)删除时会返回指向下一个值的地址,请大家各抒已见!!!谢谢

论坛徽章:
0
6 [报告]
发表于 2006-04-23 21:39 |只看该作者
我在Fadero Core 4下编译通过.在其它平台可能不正确, 这是不可移植的代码.

论坛徽章:
0
7 [报告]
发表于 2006-04-24 08:36 |只看该作者
你的程序不是删除数组的奇数下标数,而是删除数组的奇数元素:

  1. #include <iostream>
  2. #include <list>

  3. using namespace std;

  4. int main(){
  5.   int a[]={0,1,1,2,3,5,8,13,21,55,89};
  6.   int sizeA = sizeof(a)/sizeof(int);
  7.   list<int> v(a,a+sizeA);
  8.   list<int>::iterator it;

  9.   for(it=v.begin();it!=v.end();) {
  10.     if((*it%2)!=0)
  11.       v.erase (it++);
  12.     else
  13.       it++;
  14.   }
  15.   for(it=v.begin ();it!=v.end();++it)
  16.     cout<<*it<<"\n";
  17.   return 0;
  18. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-04-24 09:24 |只看该作者
候捷专门有篇文章讲这个,你可以找来看一下。

具体原因是因为erase后,iterator会移到它的下一个元素上,此时你在对它++,相当于一次移动了2个位置,这样可能会越界,就会出错。

论坛徽章:
0
9 [报告]
发表于 2006-04-24 09:43 |只看该作者
原帖由 wxp19831104 于 2006-4-23 20:24 发表
候捷专门有篇文章讲这个,你可以找来看一下。

具体原因是因为erase后,iterator会移到它的下一个元素上,此时你在对它++,相当于一次移动了2个位置,这样可能会越界,就会出错。

erase(j)总会使j失效。
唯一的办法是erase(j++)。
erase(j); j++ //错

论坛徽章:
0
10 [报告]
发表于 2006-04-24 21:07 |只看该作者

回复 9楼 catbert 的帖子

谢谢大家,真是受益非浅啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP