C++ 运行时错误:向量下标超出范围

C++ 运行时错误:向量下标超出范围,c++,runtime-error,C++,Runtime Error,所以,我写了这段代码: int main() { int max; cin >> max; vector<int> nums; for (int i = 2; i <= max; i++) { nums.push_back(i); } for (int i = 2; i <= max/10; i++) { for (int j = i; j <= max; j += i) { nums[j - 2] = num

所以,我写了这段代码:

int main()
{
int max;
cin >> max;

vector<int> nums;
for (int i = 2; i <= max; i++)
{
    nums.push_back(i);
}

for (int i = 2; i <= max/10; i++)
{
    for (int j = i; j <= max; j += i)
    {
        nums[j - 2] = nums.back(); // problem maybe here
        nums.pop_back();
    }
}

for (int x : nums)
{
    cout << x << "\n";
}
}

输入max值后,我得到运行时错误。我包括iostream、string、vector、algorithm、cmath和using namespace std。我不知道问题出在哪里。

为什么不把

cout << "vector size is " << nums.size() << '\n';
在你的代码中,可能还会看到循环中的j是什么


然后,您将看到下标超出范围的位置。请注意,每次执行nums.pop_back都会将向量的大小减少1。这发生在您的内部循环中。

我包括了iostream、string、vector、algorithm、cmath和using namespace std。-这怎么可能与运行时错误有关?顺便说一句,想想你的程序是做什么的。您正在将其索引到界限之外。哦,看在上帝的份上,请使用调试器。内部循环从向量中删除项,但您仍然可以循环,因为它会在第一个初始化循环中插入所有项。您不应该使用int作为std::vector的索引类型。vector提供用于索引和大小的类型size\u type。想想有符号索引类型(例如int-index类型)意味着什么。这意味着负指数是有效的,但容器中的负指数意味着什么?指数不是负的。j=i,i=2,2-2为0,因此索引为0。pop_back会更改向量的大小,因此从2到max的迭代将不再有效。一旦j-2大于向量中的元素数,索引运算符[]将访问超出范围的向量,正如您在某个点看到的。