私はcsv解読用のプログラムを書いてるときに、特定要素にアクセスするためにこんなのを実装してました。
//csv.h
//std::vector<std::vector<std::string>> csv;
std::string CSV::At(const int& x, const int& y) const {
try {
return csv[y][x];
}
catch (...) {
return "0";
}
}
vectorの範囲外へアクセスした際に投げられるout of range
をキャッチして、とりあえず"0"を返すようにしてます。
そしていざ範囲外アクセスのテスト・・・(Releaseモード)
一連の流れ
わい「ん?落ちたぞ」
(Debugに変更)
わい「ん?キャッチされてへんな・・・なんでや?」
わい「とりあえずデバッグや」
VS君「out of range!!!」
わい「は?」
わい 考えるのをやめる
~翌日~
わい「やっぱわかんない おしえてぐーぐるせんせい」
検索「vector out of range catch」
結果「すたっくおーばーふろー」
回答「[]
は例外投げへんで~ そのかわり.at()
なら投げてくれるからそっち使い~」
わい「!?!?!?」
わい「修正っと」
try {
return csv.at(y).at(x);
}
catch (...) {
return "0";
}
テスト結果:ちゃんと0が表示される
わい「しゃあああああああああああああ!」
なにがあった?
回答にあった通り、[]
は例外を投げません。
.at()
はアクセス時に境界チェックを行い、範囲外であれば例外としてout of range
を投げます。 しかし[]
はチェックしてくれないようで、例外が投げられることはないとのこと(範囲外アクセスは未定義動作)。なので例外がキャッチされることはなかった。わいの1日返して・・・
だから
これからは必要なかったらvector(だけに限らずほかのコンテナでも).at()
を使っていこう。
補足
return csv.at(x).at(y);
だとx、yが逆になるよ!!(1敗)
あっ、みんな知ってる・・・? マジ・・・?