16

I noticed today that std::vector::at() is significantly slower than accessing values with square brackets []. According to the doc .at() is safer because it won't let me access values beyond the bounds of the array. However, even if I access out of bound values with at(), I'll obviously still have an error, so that's something I need to avoid no matter what.

So is there any good reason why anyone would use at() instead of []?

4

6 に答える 6

22

インデックスが制御に含まれていないと考える理由がある場合、または制御フローが特に複雑でバグを追跡している場合はat()、デバッグフェーズで使用することをお勧めしますが、ループ内や次のような状況では使用しないでください。インデックスが安全であることを知っています。

他の状況でも、インデックスを事前検証する必要があります(たとえば、ユーザー入力の場合)。または、複雑なアルゴリズムから値を取得するだけの場合はassert、バグがある場合はそれを使用して修正します。[編集]または、非常に複雑なアルゴリズムを作成していて、すべてのインデックスが常に有効であるかどうかわからない場合は、at()そのアルゴリズム内で使用して、呼び出しをtryブロックに入れることができますが、ここでも望ましいです。攻撃的であり、アサーションで使用する。[/]

at()個人的には、リリースコードに生き残るための正当な理由はわかりません。制御フローを指示する便利な方法として例外処理を使用したいいくつかの例を考案することもできますが、そのようなユースケースは非常に状況に応じたものになります。

于 2011-08-02T11:32:46.767 に答える
11

at()との違いはoperator[]at()要求された位置が範囲外である場合に out_of_range 例外をスローして通知することです。
したがって、at()を使用すると、エラー状態に対応できます。operator[] を使用してインデックス外のベクトルにアクセスすると、未定義の動作が発生します。

于 2011-08-02T11:32:19.710 に答える
4

at範囲チェックは行いますが、operator[]行いません。たとえば、-1をat()に渡すと、std::out_of_rangeがスローされます。しかし、同じことをoperator[]すると、クラッシュしたり、奇妙なことが起こります。

インデックスに問題がないことが確実な場合、または自分でチェックを実行する場合は、を使用しますoperator[]

于 2011-08-02T11:34:37.033 に答える
1

at()インデックス付きの要素を返し、i インデックスが範囲外の場合は範囲​​エラー例外をスローiします。したがって、範囲外の場合は未定義の動作が発生するため、at()ではなく使用することをお勧めします。[]あなたがあなたのproggy使用で安全を望むならばat():)。

于 2011-08-02T11:33:00.403 に答える
1

at()はout_of_range例外をスローしますが、[]はスローしません。

したがって、範囲外の何かにアクセスしようとすると[]によってアプリケーションがすぐにクラッシュする可能性がありますが、at()を使用すると、実行時にエラーを処理できます。

これが必要な場合(範囲外の何かにアクセスすると、コードのセマンティクスが想定どおりに機能しないことを自動的に意味するため、多くの場合、そうではありません)、at()を使用する必要があります。

于 2011-08-02T11:34:33.937 に答える
0

ある種のシグナルシステムとして例外を使用しないと仮定すると、違いはvector::at()、範囲外のインデックスにアクセスしようとすると常に例外がスローされることです。 vector::operator[]未定義の値を返すか、アクセス違反の例外をスローする(またはクラッシュする)可能性があります。

于 2011-08-02T11:34:33.807 に答える