程序运行时出错:

siemun 2011-09-30 12:35:51
//******************************
//** Josephus问题解法六 **
//** jose6.cpp **
//******************************

#include <iostream>
#include <iomanip>
#include <list>
using namespace std;
void Step(int m);
void Init(int);

list <int> josephus; //创建单向链表模板类的全局对象
list<int>::iterator prev; //创建josephus迭代算子
list<int>::iterator iter; //创建josephus迭代算子

int main()
{
int n=10, s=1, m=3; //随取三个合理的整数
Init(n);
iter=josephus.end();
Step(s);

for(int i=1; i<n; i++){
Step(m);
cout << *iter << " ";
//iter=prev;
int t=*iter;
josephus.remove(t);

}
cout <<"\nThe winner is "<<*iter << endl;
return 0;
}

//以下是构造链表,初始化小孩编号的函数
void Init(int n)
{
for(int i=1; i<n; i++){
josephus.push_back(i);
}
list<int>::iterator it=josephus.begin(); //创建josephus迭代算子
while (it != josephus.end())
{
cout << *it << " ";
it++;
}
cout << endl;

}


//以下是要将指针从当前位置挪到往下数第m个小孩的位置
void Step(int m)
{
for(int i=0; i<m; i++){
prev=iter;
iter++; //第三次进入时,出错:access violation
if(iter==josephus.end())
iter=josephus.begin();
}
}
...全文
112 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-09-30
  • 打赏
  • 举报
回复

for(int i=1; i<n; ) // 此处的++i删除,在下面增加++i
{
Step(m);
cout << *iter << " ";
//iter=prev;
int t=*iter;
if (删的条件满足)
iter = josephus.remove(t); // remove返回的就是下一个元素的iter
else
++i; // 在这里增加++i
}


remove后,通常会产生iter失效的问题(因为内存会发生变动),上面的做法是处理remove失效的经典做法。
野男孩 2011-09-30
  • 打赏
  • 举报
回复
迭代器还是别玩儿全局的吧。。。。。原因同楼上~~
bdmh 2011-09-30
  • 打赏
  • 举报
回复
直接for循环迭代器,别用i来索引,参考
http://apps.hi.baidu.com/share/detail/20376194
pengzhixi 2011-09-30
  • 打赏
  • 举报
回复
josephus.remove(t);
就要考虑迭代器失效的问题了。
cc之家 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pathuang68 的回复:]
C/C++ code

for(int i=1; i<n; ) // 此处的++i删除,在下面增加++i
{
Step(m);
cout << *iter << " ";
//iter=prev;
int t=*iter;
if (删的条件满足)
iter = josephus.remove(t); // remove返回的……
[/Quote]++
siemun 2011-09-30
  • 打赏
  • 举报
回复
明白了,晚上回去试试
luciferisnotsatan 2011-09-30
  • 打赏
  • 举报
回复
google 迭代器失效
pathuang68 2011-09-30
  • 打赏
  • 举报
回复
另外建议,不要用int值来遍历,直接用iterator就很好,删除元素用erase。具体做法请参考:

for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); )
{
if (删的条件满足)
it = mylist.erase(it); // 用erase返回的就是下一个元素的iter
else
++it;
}

64,647

社区成员

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

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