整数のマップを確立するためのベクトルのベクトルがあり、次のようにして、ベクトルがスローされるたびに範囲外のエラーをキャッチしたいと思います。
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.";
}
しかし、私のコードはエラーをまったくキャッチしていないようです。それでもstd :: terminateを実行したいようです。誰かがこれでどうしたのか知っていますか?
例外をスローしたい場合は、 std::vector::at
を使用してください1operator[]
の代わりに:
try {
agrid.at(-1).at(-1) = 5;
}
catch (const std::out_of_range& e) {
cout << "Out of Range error.";
}
1-境界チェックを使用して、指定された場所pos
にある要素への参照を返します。 pos
がコンテナの範囲内にない場合、タイプstd::out_of_range
の例外がスローされます
Std :: vector :: operator [](size_type)は、範囲チェックを適用しません(これは良いことです)。関数std :: vector :: at(size_type)は実行します(これは怠惰なプログラマーに適しています)。したがって、適切な範囲を確保するか、最初にチェックして、いくつかの有用な例外をスローします(実際にそれを行う必要がある場合)。
(注:デバッグコンパイルでは異なる場合があります)