web-dev-qa-db-ja.com

ベクトルのベクトルで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.";
}

しかし、私のコードはエラーをまったくキャッチしていないようです。それでもstd :: terminateを実行したいようです。誰かがこれでどうしたのか知っていますか?

15
David Chan

例外をスローしたい場合は、 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の例外がスローされます

19
LihO

Std :: vector :: operator [](size_type)は、範囲チェックを適用しません(これは良いことです)。関数std :: vector :: at(size_type)は実行します(これは怠惰なプログラマーに適しています)。したがって、適切な範囲を確保するか、最初にチェックして、いくつかの有用な例外をスローします(実際にそれを行う必要がある場合)。

(注:デバッグコンパイルでは異なる場合があります)

3
user2249683