谁能帮我看看这个小程序?

Botton2008 2004-06-25 05:03:19
问题:

请写一个程序,使它接受下列定义:
int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89}
list<int> ilist(ia, ia+11)
用单个iterator形式的erase()删除ilist中所有奇数位置的元素。


我的源程序如下:

#include <iostream>
#include <list>
#include <conio.h>

using namespace std;

int main()
{
int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
list<int> ilist(ia, ia + 11);

int size = ilist.size();
list<int>::iterator iter;

//show the elements of ilist
cout << "ilist("<< size <<"): {";

int i = size;
for (iter = ilist.begin(); iter != ilist.end(); ++iter, --i) {
cout << *iter;
if (i != 1)
cout << ", ";
}

cout << "}" << endl;

//delete the elements in odd position
i = 1;
for (iter = ilist.begin(); i < size && iter != ilist.end(); ++iter, ++i)
if ( i % 2 )
ilist.erase(iter);

size = ilist.size();
i = size;

//show the result
cout << "\nAfter the deletion operation...\n"
<< "ilist("<< size <<"): {";

for (iter = ilist.begin(); iter != ilist.end(); ++iter, --i) {
cout << *iter;
if (i != 1)
cout << ", ";
}

cout << "}" << endl;

cout << "\nPress any key to exit..." << endl;
getch();

return 0;
}

程序调试环境:Dev-C++ 4.9.8.0

运行结果:程序异常中止
...全文
99 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Botton2008 2004-06-25
  • 打赏
  • 举报
回复
谢谢Jinhao和Downcast,我终于知道问题出在什么地方了!:)
downcast 2004-06-25
  • 打赏
  • 举报
回复
这样也可以
//delete the elements in odd position
iter = ilist.begin();
i = 1;
while (iter != ilist.end()) {
if ( i % 2 ) {
ilist.erase(iter++);
i++;
}
else {
iter++;
i++;
}
}

或者把需要的iterator先集中起来再一起处理也可以
Jinhao 2004-06-25
  • 打赏
  • 举报
回复
这个是老问题了,在list,vector,等等这些容器里,iterator会出现失效的情况

int main() {
int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
list<int> ilist(ia, ia + 11);

int size = ilist.size();
list<int>::iterator iter;

//show the elements of ilist
cout << "ilist("<< size <<"): {";

int i = size;
for (iter = ilist.begin(); iter != ilist.end(); ++iter, --i) {
cout << *iter;
if (i != 1)
cout << ", ";
}

cout << "}" << endl;

//delete the elements in odd position
i = 1;
for (iter = ilist.begin(); i < size && iter != ilist.end(); ++iter, ++i)
{
list<int>::iterator lastiter;
if ( i % 2 )
{
lastiter=iter--;
ilist.erase(lastiter); //lastiter被erase后就无效了
}
}
size = ilist.size();
i = size;

//show the result
cout << "\nAfter the deletion operation...\n"
<< "ilist("<< size <<"): {";

for (iter = ilist.begin(); iter != ilist.end(); ++iter, --i) {
cout << *iter;
if (i != 1)
cout << ", ";
}

cout << "}" << endl;

cout << "\nPress any key to exit..." << endl;
getch();
return 0;
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧