LoginSignup
2
0

More than 1 year has passed since last update.

std::vectorの[ ]に引っかかった話

Posted at

私はcsv解読用のプログラムを書いてるときに、特定要素にアクセスするためにこんなのを実装してました。

csv.cpp
//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に変更)

画面君
image.png

わい「ん?キャッチされてへんな・・・なんでや?」
わい「とりあえずデバッグや」
VS君「out of range!!!」
わい「は?」

わい 考えるのをやめる

  ~翌日~

わい「やっぱわかんない おしえてぐーぐるせんせい」
検索「vector out of range catch」
結果「すたっくおーばーふろー

回答「[]例外投げへんで~ そのかわり.at()なら投げてくれるからそっち使い~」

わい「!?!?!?」
わい「修正っと」

csv.cpp
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敗)

あっ、みんな知ってる・・・? マジ・・・?

2
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0