我正在尝试其中一个项目的欧拉问题,第一个问题是你要求你计算低于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 ++,并且想尝试使用我最近学到的一些东西。
答案 0 :(得分:4)
std::vector<T>::erase
将在最后一个删除元素后返回一个迭代器。如果删除最后一个元素,则返回的迭代器将为end()
。然后你增加迭代器并得到一个异常。此外,即使您不删除最后一个条目而另一个条目,您仍将忽略以下元素。
顺便说一句,您想用five[*it]
实现什么目标?迭代器就像一个指向容器中给定元素的指针。要么使用带有int i
和five[i]
的简单for循环(这将与我上面提到的问题相同)或 *it
。 * < / SUP>
请尝试使用以下代码:
for(vector<int>::iterator it = five.begin(); it != five.end();)
{
if (*it % 3 == 0)
{
it = five.erase(it);
}
else
++it;
}
*虽然迭代器的值确实是它自己的键,但这只会持续到你第一次更改向量为止。因此,在您第一次擦除five[*it] != *it
。
答案 1 :(得分:0)
我认为你想要实现的是由两个第一个for
循环完成的。第一个循环将收集3的所有整数,第二个循环将所有整数乘以5的整数。执行擦除的循环是冗余的(在这些循环中存在使用erase
在循环中已经使用的迭代器上的问题)