1

プロジェクトオイラーの問題の1つを試していました。最初の問題では、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 ++を学んでいて、最近学んだことのいくつかを試して使用したいと思っていました。

4

2 に答える 2

5

std::vector<T>::erase最後に削除された要素に続くイテレータを返します。最後の要素を削除すると、返されるイテレータはになりますend()。次に、イテレータをインクリメントして例外を取得します。また、最後のエントリではなく別のエントリを削除しても、次の要素は無視されます。

ちなみに、何を達成したいfive[*it]ですか?イテレータは、コンテナ内の特定の要素へのポインタのように機能します。int i and five[i](上記と同じ問題が発生します)または 。を指定した単純なforループを使用します*it*

代わりに次のコードを試してください。

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

*イテレータの値が独自のキーであることは事実ですが、これは最初にベクトルを変更するまでしか持続しません。したがって、最初の消去後five[*it] != *it

于 2012-08-04T15:52:43.373 に答える
0

あなたが達成したいことは、最初の2つのforループによって行われると思います。最初のループは3の倍数のすべての整数を収集し、2番目のループは5の倍数のすべての整数を収集します。消去を実行するループは冗長です(これらのループではerase、ループですでに使用されているイテレータでの使用に問題があります)

于 2012-08-04T15:59:25.137 に答える