2013-10-07 10 views
7

ich einen Vektor von Vektoren haben eine Karte von ganzen Zahlen zu schaffen, und ich würde gerne einen Vektor aus Bereichsfehler zu fangen, wenn es geworfen wird, indem Sie folgendermaßen vorgehen:Fangen auf einem Vektor von Vektoren out_of_range

vector< vector<int> > agrid(sizeX, vector<int>(sizeY)); 

try { 
    agrid[-1][-1] = 5;  //throws an out-of-range 
} 
catch (const std::out_of_range& e) { 
    cout << "Out of Range error."; 
} 

Mein Code scheint jedoch den Fehler überhaupt nicht zu erfassen. Es scheint immer noch std :: terminate laufen zu wollen. Weiß jemand was damit?

Antwort

12

Falls Sie es eine Ausnahme zu werfen, std::vector::at statt operator[] verwenden:

try { 
    agrid.at(-1).at(-1) = 5; 
} 
catch (const std::out_of_range& e) { 
    cout << "Out of Range error."; 
} 

1 - Gibt einen Verweis auf das Element an der angegebenen Stelle pos, mit Grenzen zu überprüfen. Wenn pos nicht im Bereich des Behälters ist, wird eine Ausnahme vom Typ std::out_of_range geworfen

2

Die std :: vector :: operator [] (size_type) gelten keine Bereichsprüfung (was gut ist). Die Funktion std :: vector :: at (size_type) tut (was für faule Programmierer gut ist). Stellen Sie daher einen angemessenen Bereich sicher oder prüfen Sie zuerst und werfen Sie eine nützliche Ausnahme (wenn Sie es tatsächlich tun müssen).

(Hinweis: In Debug-Compilations könnte es anders sein)