C ++は、パフォーマンスのために作成された言語です。1,000万個のアイテムを含む配列があり、すべてのアイテムを合法的にウォークスルーする場合、それらの1,000万個のアクセスのすべてが有効かどうかを確認する時間が追加されます。副作用として、「正しい」状況下では、検出されずに有効な範囲外に出ることもできます。有効な範囲から大きく外れると、何かがうまくいかない可能性があります。しかし、C ++は、それがうまくいかないこと、または他に何が起こるかを保証しません-それは「未定義動作」と呼ばれるものです-略してUB。
マップの場合、それはとにかくあなたが思っていることをしません、それは実際にあなたのコンテナに新しい空の要素を作成し、そしてそれを印刷します。
したがって、「不明な」インデックスがある場合(たとえば、インデックスをパラメーターとして受け取る関数など)、少なくともコードのデバッグビルドでは、値が範囲内にあることを確認することをお勧めします。たとえば、次のassert()
ように使用できます。
// v is a vector, or string, or some such.
assert(index < v.size);
これにより、有効な範囲外になるとプログラムが「中断」されます。リリースビルドでは、assert
何もコンパイルされないため、適切なリリースビルドでコードを実行するときに余分なコードはありません。