为什么我得到:"cannot seek vector iterator after end"
why am i getting: "cannot seek vector iterator after end"
所以我正在尝试使用 c++
解决 josephus 问题
第一个输入是人数,第二个是杀死下一个人的位置
我收到 运行 时间错误:“结束后无法寻找向量迭代器”
代码:
// josephus.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int people = 0, pos = 0;
cin >> people >> pos;
vector<int> vp;
for (int i = 1; i <= people; ++i)
{
vp.push_back(i);
}
int index = 0;
while (vp.size() != 1)
{
index += pos - 1;
if (index >= vp.size())
{
index -= vp.size();
}
vp.erase(vp.begin() + index);
}
cout << vp[0] << endl;
return 0;
}
有趣的是输入数据 10 3 (people = 10, pos = 3) 没有错误。它给出了正确答案 4.
但是对于输入 94 31 (people = 94, pos = 31) 它给了我 运行-time 错误。
我认为问题出现在擦除功能上。
我已经尽力了。感谢任何帮助。
正如1201ProgramAlarm提到的注释,index
可以大于vp.size()
,这意味着当你试图擦除vp.begin() + index
时,它会失败,因为后面没有元素vp.end() - 1
。 vp.begin()
和 vp.end()
是迭代器,因此当您尝试 在结束 (vp.end()
) 之后寻找 迭代器时,它会失败并准确地告诉您。
该程序具有未定义的行为,因为根据序列容器的要求,成员函数 erase
的参数应该是一个有效的 可取消引用 迭代器。然而由于这个声明
index += pos - 1;
index
的值可以大于或等于表达式 2 * ( current size of the vector)
.
的值
在这种情况下,在下一个 if 语句中
if (index >= vp.size())
{
index -= vp.size();
}
index
会得到一个大于或等于 vp.size()
.
的值
因此调用
vp.erase(vp.begin() + index);
不会使用有效的可解引用迭代器。
所以我正在尝试使用 c++
解决 josephus 问题第一个输入是人数,第二个是杀死下一个人的位置
我收到 运行 时间错误:“结束后无法寻找向量迭代器”
代码:
// josephus.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int people = 0, pos = 0;
cin >> people >> pos;
vector<int> vp;
for (int i = 1; i <= people; ++i)
{
vp.push_back(i);
}
int index = 0;
while (vp.size() != 1)
{
index += pos - 1;
if (index >= vp.size())
{
index -= vp.size();
}
vp.erase(vp.begin() + index);
}
cout << vp[0] << endl;
return 0;
}
有趣的是输入数据 10 3 (people = 10, pos = 3) 没有错误。它给出了正确答案 4.
但是对于输入 94 31 (people = 94, pos = 31) 它给了我 运行-time 错误。 我认为问题出现在擦除功能上。
我已经尽力了。感谢任何帮助。
正如1201ProgramAlarm提到的注释,index
可以大于vp.size()
,这意味着当你试图擦除vp.begin() + index
时,它会失败,因为后面没有元素vp.end() - 1
。 vp.begin()
和 vp.end()
是迭代器,因此当您尝试 在结束 (vp.end()
) 之后寻找 迭代器时,它会失败并准确地告诉您。
该程序具有未定义的行为,因为根据序列容器的要求,成员函数 erase
的参数应该是一个有效的 可取消引用 迭代器。然而由于这个声明
index += pos - 1;
index
的值可以大于或等于表达式 2 * ( current size of the vector)
.
在这种情况下,在下一个 if 语句中
if (index >= vp.size())
{
index -= vp.size();
}
index
会得到一个大于或等于 vp.size()
.
因此调用
vp.erase(vp.begin() + index);
不会使用有效的可解引用迭代器。