2012-03-25 7 views
3

Der folgende Code diesen Fehler verursacht:Warum erhalte ich einen Fehler "Vektor-Iterator + Offset außerhalb des Bereichs"?

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

Wenn ich den Wert searchDepth - depth zum Zeitpunkt des Fehlers überprüft, war es 0.

So im Wesentlichen,

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

verursacht diesen Fehler. (Oder auch nicht. Siehe Anmerkungen unten).

Mein Wissen der obige Code den gesamten Vektor löschen sollte, die das gewünschte Verhalten in diesem Fall ist.

Was mache ich falsch?

+0

Haben Sie den ersten Code mit dem zweiten Code ersetzen (was Sie denken, im Wesentlichen gleich ist), und sehen, ob der Fehler noch kommt? – Nawaz

+0

Gute Idee. Nein, ich habe keinen Fehler erhalten. Jetzt bin ich wirklich verwirrt. Ich fügte 'cout << searchDepth-depth;' vor diesen zwei Zeilen hinzu und sah zwei Nullen vor der Debug-Assertion. –

+1

Try Klammern Ihren Ausdruck 'bestLine.end() Zugabe - (searchDepth - Tiefe)' – Blastfurnace

Antwort

5

Versuchen Sie, Klammern zu Ihrem Ausdruck hinzuzufügen: bestLine.end() - (searchDepth - depth). Das Ergebnis ist sehr unterschiedlich, wenn man es einfach von links nach rechts auswertet. Diese

+0

Ja, dies korrigiert die Reihenfolge der Operationen. –

+0

Wie kommt es, dass dies den Fehler behebt und was ich vorgeschlagen habe, nicht? –

+1

@izomorphius: Weil Sie zu viel abziehen könnten, über den Anfang hinausgehen. Dies subtrahiert die minimale Menge. (Überlegen Sie, ob 'end - begin '' 5' war, 'searchDepth' war' 10' und 'depth' war' 10'.) – GManNickG

1

Sie überprüfen, ob bestLine.size() größer ist dann searchDepth - Tiefe, aber dann Sie subtrahieren searchDepth + Tiefe. Ändern Sie das Zeichen vor der Tiefe in der Subtraktion: bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth *+* depth);

+0

Das funktioniert nicht für mich, fürchte ich. Ich erhalte den gleichen Fehler. –

1

ist kein Codierungsproblem, sondern ein Mathe ein.

Problematische Mathematik:

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

Also, anstatt (searchDepth - Tiefe) zu löschen versuchen, Elemente, Sie (searchDepth + Tiefe) Elemente zu löschen versuchen.

Richtige Mathematik:

bestLine.end() - (searchDepth - depth) 
Verwandte Themen