1. ホーム
  2. c++

[解決済み] vector::at vs. vector::operator[].

2022-09-18 01:34:35

質問

私は、以下のことを知っています。 at() よりも遅いです。 [] のような類似の質問でも議論される境界チェックのためです。 C++のベクトルat/[]演算子の速度 または ::std::vector::at() vs operator[] << 驚きの結果!!!! 5〜10倍遅い/速い! . の意味がわからないんだけど at() メソッドは何のためにあるのか理解できません。

このような単純なベクトルがあったとして std::vector<int> v(10); で、その要素にアクセスするために at() の代わりに [] というインデックスがある場合 i で、それがベクタの境界内にあるかどうかわからない場合、強制的に トライキャッチブロックで囲む :

try
{
    v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
    ...
}

を使っても同じ動作になるのですが size() を使って、自分でインデックスをチェックすることで、同じ動作を得ることができます。

if (i < v.size())
    v[i] = 2;

そこで質問なのですが

を使用する利点は何ですか? ベクトル::at 以上 ベクトル::演算子[] ?

どのような場合に ベクトル::at よりも ベクトル::サイズ + ベクトル::演算子[] ?

どのように解決するのですか?

例外として vector::at() が投げる例外は、実際にはすぐ周りのコードで捕捉されることを意図したものではありません。これらは主にコードのバグをキャッチするのに便利です。インデックスがユーザからの入力であるなどの理由で、実行時に境界チェックをする必要がある場合は、確かに if ステートメントを使うのがベストです。つまり、要約すると、コードを設計するときには vector::at() が例外を投げないように、そして、もし例外が起きてプログラムが中断したら、それはバグの兆候であるように。(ちょうど assert() )