为什么我得到:"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() - 1vp.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);

不会使用有效的可解引用迭代器。