2012-03-25 8 views
3

次のコードは、このエラーの原因となっている:私は、エラーの時にsearchDepth - depthの値をチェックすると「ベクトルイテレータ+オフセットが範囲外です」というエラーが表示されるのはなぜですか?

if (bestLine.size() > searchDepth - depth) 
    bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth - depth); 

、それは0でした。

ので、基本的に、

if (bestLine.size() > 0) 
    bestLine.erase(bestLine.begin(), bestLine.end()); 

は、このエラーの原因となっています。 (または、以下のコメントを参照してください)

私の知る限りでは、上記のコードは、ベクトル全体を消去する必要があります。

私は間違っていますか?

+0

あなたは(あなたが本質的に同じだと思います)は、第2のコードで最初のコードを交換し、エラーはまだ来るかどうかを確認しましたか? – Nawaz

+0

良いアイデア。いいえ、私はエラーを受け取りませんでした。今私は本当に混乱しています。これらの2行の前に 'cout << searchDepth-depth;'を追加し、デバッグアサーションの前に2つのゼロを見ました。 –

+1

式 'bestLine.end() - (searchDepth - depth)'に括弧を入れてみてください。 – Blastfurnace

答えて

5

式にかっこを追加してみてください:bestLine.end() - (searchDepth - depth)。単純に左から右に評価すると、結果は大きく異なります。

+0

はい、これは操作の順序を修正します。 –

+0

どうすればこのエラーが修正され、私が提案したことはありませんか? –

+1

@izomorphius:あまりにも多くを引くかもしれないので、最初を過ぎて行ってください。最小値を減算します。 ( 'end-begin'が' 5'、 'searchDepth'が' 10'、 'depth'が' 10'だったとします。) – GManNickG

1

bestLine.size()がsearchDepth-depthより大きいかどうかをチェックしますが、searchDepth + depthを引いてチェックします。減算の前に符号を変更してください: bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth *+* depth);

+0

これは私のために働かない、恐れている。同じエラーが表示されます。 –

1

これはコーディングの問題ではなく、数学的な問題です。

問題の数学:だから

bestLine.end() - searchDepth - depth 
=> bestLine.end() + (-1) * searchDepth + (-1) * depth 
=> bestLine.end() + (-1) * (searchDepth + depth) 
=> bestLine.end() - (searchDepth + depth) 

、というよりも(searchDepth - 深さ)を消去しようとしている要素を、あなたは、要素(searchDepth +深さ)を消去しようとしていました。

正しい数学:

bestLine.end() - (searchDepth - depth) 
関連する問題