c[i]
とc.at(i)
の違いはi
ベクトルの範囲外である場合operator[]
は単に何かが起こることを意味しており、未定義の動作を起動しながらは、std::out_of_range
例外をスローすることです。
at()
はoperator[]
より優れています。それは状況によって異なります。 at()
は範囲チェックを実行するので、特にコード自体がインデックスが範囲外になることがないようにする場合は、常に望ましいとは限りません。そのような場合は、operator[]
が良いです。 operator[]
は常にat()
メンバ関数と比較してより良い選択である、このようなループでは
for(size_t i = 0 ; i < v.size(); ++i)
{
//Should I use v[i] or v.at(i)?
}
:
は、次のループを考えてみましょう。
インデックスが無効な場合に例外をスローしたい場合はを好むので、catch{ ...}
ブロックで代替作業を行うことができます。
ここ
try
{
size_t i = get_index(); //I'm not sure if it returns a valid index!
T item = v.at(i); //let it throw exception if i falls outside range
//normal flow of code
//...
}
catch(std::out_of_range const & e)
{
//alternative code
}
あなたはそれが有効な指標であることを確認するために、i
を自分で確認し、at()
の代わりにoperator[]
を呼び出すことができますが、:例外は、あなたがとして例外的/代替コードから通常のコードを分離役立ちますif-else
ブロックを使用して通常のコードと代替コードを混ぜると、コードの正常な流れを読むことが難しくなります。上記の場合、try-catch
は、が代替コードから正常なコードを実際に分けてしまうため、コードの可読性が向上し、きれいで清潔なコードになります。
「違いは何ですか?」良い質問です。答えは、1)自動レンジチェック(.at()は範囲外の例外をスローし、[]は暗黙に失敗する)、2)個人的な好み - どちらの構文がより好きですか? "どちらが良いですか"、一方では価値判断です。答えは必然的に "それは依存する"。 IMHO ... – paulsm4
誰も優れているわけではありません。 –