web-dev-qa-db-ja.com

unordered_map:find()とcount()のどちらが速いですか?

unordered_mapコンテナに指定されたキーを持つアイテムがあるかどうかを判断する最も速い方法は何ですか?

24
Kimi

それらはほぼ同等のパフォーマンスを持ちます。やろうとしていることを最もよく表すアルゴリズムを使用する必要があります。

これについて詳しく説明すると、通常、count()find()を使用して実装されます。たとえば、 libcxx では、count()return (find(__k) != end());として実装されます。

29
Bill Lynch

find()およびcount()は、C++の多くのコンテナーに適用できます。

マップ、セットなどの場合、findはハッシュを計算するだけなので、常に一定の実行時間を持ち、最初に見つかった要素(見つからない場合はend())にイテレーターを返します。

一方、count()の実行時間は一定ですO(e)。ここで、eは指定されたキーが見つかった回数です。最悪のケースは、すべてのメンバーが同じであるコレクションであるため、countの複雑さはO(n)になる可能性があります。

mapまたはunordered_map重複を許可しないため、それらの漸近実行時間は同じになります。

選択は、コードのセマンティクスによって異なります。キーが存在するかどうかだけを確認したい場合は、countを使用できます。キーが存在するかどうかを確認し、その値を使用する場合は、その要素を指すイテレータがすでに存在するため、findに移動します。

0
Visiedo