关于使用deque容器解决约瑟夫问题,出现意想不到的结果,希望能到得到大佬解答出现异常的原因

弹琴de胡椒 2018-05-21 07:07:39

#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <iterator>
using namespace std;

template <typename T>
int yuesefu(int n,int m,T&s)//n为人数 m为数到m退出
{
int j=1;
s.clear();
for (int i=1;i<=n;i++)
{
s.push_back(i);
}
typename T::iterator iter;
while (s.size()>1)
{
for(j=1;j!=m;++j)
{
iter=s.begin();
s.push_back(*iter); //不断的把前面的数据放到后面
iter=s.erase(iter);//然后删除前面的数据
}
iter=s.erase(iter);//把数到m的删掉
/*if(s.size()<5)
{
for(typename T::iterator i=s.begin();i!=s.end();i++)
{
cout<<*i<<" ";
}
cout<<endl;
}*/
}
return *s.begin();
}

int main()
{

vector<int> s(1);
cout<<yuesefu(129,7,s)<<endl;

deque<int> s2(1);
cout<<yuesefu(129,7,s2)<<endl;

list<int> s1(1);
cout<<yuesefu(129,7,s1)<<endl;

return 0;
}

出现的问题就是,当我传入模板参数deque来解决问题时,得到的结果与传入vector和list的结果不同,明显答案有错,但是明明使用的是一个模板函数,里面使用的容器方法也都是三个容器都有的方法,deque出现异常,其他均为正常答案(deque出现异常在n大于某个值时出现 预测和m有关)
我想要知道为什么会出现这种结果,希望有大佬能够解答, 主要不是解决约瑟夫问题(可以使用很多其他方法解答),主要是提问异常的原因,求教大神们!!!!!!
下面两张是异常答案截图

当数据n和m合适的时候 答案又是对的 如下
...全文
895 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
donjin9 2018-05-23
  • 打赏
  • 举报
回复
iter=s.begin();
s.push_back(*iter);  //不断的把前面的数据放到后面
iter=s.begin(); //增加一行
iter=s.erase(iter);//然后删除前面的数据
赵4老师 2018-05-22
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

64,637

社区成员

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

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