C++ 矢量下标超出范围错误消息

C++ 矢量下标超出范围错误消息,c++,C++,我在尝试一个euler项目的问题,第一个问题要求你计算1000以下所有3和5的倍数之和。 我尝试了它,但它没有显示任何错误,但是当我运行它时,我会收到一个带有错误的消息框: Microsoft Visual C++ Debug Library Debug Assertion Failed! Program: ...\c++ learning\project euler ex 1\Debug\project euler ex 1.exe File: c:\Program Files (x86)

我在尝试一个euler项目的问题,第一个问题要求你计算1000以下所有3和5的倍数之和。 我尝试了它,但它没有显示任何错误,但是当我运行它时,我会收到一个带有错误的消息框:

Microsoft Visual C++ Debug Library

Debug Assertion Failed!

Program: ...\c++ learning\project euler ex 1\Debug\project euler ex 1.exe
File: c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector
Line: 932

Expression: vector subscript out of range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

Abort   Retry   Ignore   
代码如下:

#include <iostream>
#include <vector>
#include <numeric>

using std::endl; using std::cout;
using std::vector;

int main()
{
vector<int> five;
vector<int> three;
int x;
int y;
int sum;

for(int i = 0; i < 1000; i = i + 5)
{
    five.push_back(i);
}

for(int i = 0; i < 1000; i = i + 3)
{
    three.push_back(i);
}



for(vector<int>::iterator it = five.begin(); it != five.end(); ++it)
{
    if (five[*it] % 3 == 0)
    {
        it = five.erase(it);
    }
}

for(vector<int>::iterator it = three.begin(); it != three.end(); ++it)
{
    if (three[*it] % 5 == 0)
    {
        it = three.erase(it);
    }
}

x = accumulate(five.begin(), five.end(), 0);
cout << x << endl;

y = accumulate(three.begin(), three.end(), 0);
cout << y << endl;

sum = x + y;
cout << sum << endl;
system("PAUSE");
return 0;
}
我知道有一个更简单的方法来解决这个问题,但是我仍然在学习C++,并且想尝试使用我最近学到的一些东西。p> 将在最后删除的元素之后返回一个迭代器。如果删除最后一个元素,则返回的迭代器将结束。然后递增迭代器,得到一个异常。此外,即使您没有删除最后一个条目,而是删除另一个条目,您仍然会忽略以下元素

顺便问一下,你想用五个[*it]来实现什么?迭代器的作用类似于指向容器中给定元素的指针。或者使用一个简单的for循环和一个int i和五[i],这将有我上面提到的相同问题,或者*it*

请尝试以下代码:

for(vector<int>::iterator it = five.begin(); it != five.end();)
{
    if (*it % 3 == 0)
    {
        it = five.erase(it);
    }
    else
         ++it;
}
*虽然迭代器的值确实是它自己的键,但这只会持续到您第一次更改向量为止。所以在你第一次擦除五个[*它]!=*它。

将在最后删除的元素之后返回一个迭代器。如果删除最后一个元素,则返回的迭代器将结束。然后递增迭代器,得到一个异常。此外,即使您没有删除最后一个条目,而是删除另一个条目,您仍然会忽略以下元素

顺便问一下,你想用五个[*it]来实现什么?迭代器的作用类似于指向容器中给定元素的指针。或者使用一个简单的for循环和一个int i和五[i],这将有我上面提到的相同问题,或者*it*

请尝试以下代码:

for(vector<int>::iterator it = five.begin(); it != five.end();)
{
    if (*it % 3 == 0)
    {
        it = five.erase(it);
    }
    else
         ++it;
}

*虽然迭代器的值确实是它自己的键,但这只会持续到您第一次更改向量为止。所以在你第一次擦除五个[*它]!=*它。

我认为您想要实现的是两个先for循环。第一个循环将收集所有3的整数倍,第二个循环将收集所有5的整数倍。执行擦除的循环是冗余的,在这些循环中,使用循环中已经使用的erase on迭代器的问题就在于此

我认为您想要实现的是由前两个for循环完成的。第一个循环将收集所有3的整数倍,第二个循环将收集所有5的整数倍。执行擦除的循环是冗余的,在这些循环中,使用循环中已使用的erase on迭代器存在问题

从向量末尾开始循环,而不是从开始。切勿修改迭代的集合。从向量末尾开始循环,不是从一开始。永远不要修改你迭代过的集合。只是注意到你是一个C++初学者。迭代器将充当智能指针。您几乎可以取消对所有迭代器的引用并增加它们,这与它们是否指向的实际内存连续无关。还要注意,推回是一种非常昂贵的方法。首先尝试使用resize或std::vector::vectorsize\t构造函数分配向量。另外,如果您想删除和添加许多元素,那么出列或列表更适合您。请注意,您不需要更改太多其他内容,因为它们都提供迭代器。迭代器将充当智能指针。您几乎可以取消对所有迭代器的引用并增加它们,这与它们是否指向的实际内存连续无关。还要注意,推回是一种非常昂贵的方法。首先尝试使用resize或std::vector::vectorsize\t构造函数分配向量。另外,如果您想删除和添加许多元素,那么出列或列表更适合您。请注意,您不需要更改太多其他内容,因为它们都提供迭代器。