std :: Map vs std :: unordered_map in c
Cでは、STD :: MAPおよびSTD :: UNORDERED_MAPの選択は、特定の要件に依存します。 1。根底にある異なる構造:STD :: MAPは、赤と黒の木に基づいて実装され、キーは順番、デフォルトの昇順、検索と挿入の複雑さがO(log n)です。 std :: unordered_mapはハッシュテーブルを使用し、順序付けられていません。平均検索と挿入の複雑さはo(1)であり、最悪はo(n)です。 2。挿入性能とメモリオーバーヘッド:マップ挿入には、ツリー構造のメンテナンスが必要であり、効率が低くなります。 UNORDERED_MAPの挿入はより速くなりますが、より多くのメモリを消費し、Reserve()を通じて最適化できます。 3。カスタム比較関数:マップはカスタム比較関数をサポートし、UNORDERED_MAPはハッシュ関数と平等判断機能を提供する必要があります。 4.トラバーサル順序:マップトラバーサル順序は予測可能かつ秩序があり、UNORDERED_MAPトラバーサル順序は予測不可能で、シーケンシャル処理のないシナリオに適しています。
Cでは、 std::map
およびstd::unordered_map
どちらもキー価値ペアを保存するために使用されるデータ構造ですが、基礎となる実装と適用可能なシナリオは完全に異なります。どちらがより適切であるかは、特定のニーズに依存します。

1。根底にある異なる構造:赤と黒の木vsハッシュテーブル
-
std::map
、赤黒樹に基づいて実装されています。つまり、キーは順番に保存されます(デフォルトの昇順)。 -
std::unordered_map
ハッシュテーブルを使用し、要素は順序付けられておらず、従属ハッシュ関数を検索します。
この違いは、パフォーマンスと機能をもたらします。
-
map
の挿入と検索時間の複雑さは、バランスの取れたバイナリ検索ツリーであるため、O(log n)です。 -
unordered_map
の平均検索と挿入はO(1)であり、最悪の場合O(N)(長い競合)ですが、通常は高速です。
整然とした方法でキー値のペアを通過する必要がある場合は、 map
を使用します。クイック検索の場合は、 unordered_map
を優先してください。

2。挿入性能とメモリオーバーヘッドの比較
また、2つの間に挿入性能に明らかな違いがあります。
-
map
を挿入するときは、ツリー構造を維持する必要があります。各挿入には、回転やその他の操作が含まれる場合があり、比較的時間がかかります。 -
unordered_map
挿入はより効率的ですが、ハッシュバケットの数を確保するために、より多くのメモリを消費します。
例えば:

std :: map <int、int> m; std :: unordered_map <int、int> um; for(int i = 0; i <100000; i){ m [i] = i; um [i] = i; }
上記のコードでは、特にデータ量が大きい場合、 um
の挿入速度は通常、 m
よりもはるかに高速です。
ただし、頻繁に再ハッシュするため、 unordered_map
パフォーマンスに影響を与える可能性があり、 reserve()
を介して事前にスペースを割り当てることができることに注意する必要があります。
3.カスタム比較関数をサポートするかどうか
map
、機能者またはLambdasで渡すことができるカスタム比較機能をサポートしています(C 14)。- ハッシュ関数に加えて、
unordered_map
、平等な判断関数(key_eq
)も提供する必要があります。
たとえば、 unordered_map
char*
キーとして使用する場合、ハッシュと比較関数をカスタマイズする必要があります。そうしないと、エラーが発生します(デフォルトは基本タイプと標準ライブラリタイプにのみ適用されます)。
struct eqstr { bool operator()(const char* s1、const char* s2)const { return strcmp(s1、s2)== 0; } }; std :: unordered_map <const char*、int、std :: hash <const char*>、eqstr> mymap;
このステップはmap
ではるかに簡単で、比較関数を渡すだけです。
4。トラバーサルオーダーは予測可能ですか?
-
map
のトラバーサル順序が決定され、デフォルトは小さいものから大規模です。 -
unordered_map
のトラバーサル順序は予測不可能であり、挿入と削除により変化する場合があります。
すべてのキーソートされたアルファベット順で結果を出力するなど、データを順番に処理する場合は、 map
のみを使用できます。
次に、注文を気にせずに各要素に一度アクセスしたい場合、 unordered_map
より効率的です。
基本的にそれだけです。実際のニーズに応じてタイプを選択するだけで、複雑ではありませんが、詳細を無視するのは簡単です。
以上がstd :: Map vs std :: unordered_map in cの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ソフトウェアまたはゲームを開くと、「アプリケーションが正常に開始できない(0xc0000906)」が表示され、多くのユーザーが混乱し、どこから始めればよいかわからないというプロンプトが突然表示されます。実際、これらのエラーのほとんどは、システムファイルの破損またはランタイムライブラリの欠落によって引き起こされます。急いでシステムを再インストールしないでください。この記事では、いくつかのシンプルで効果的なソリューションを提供して、プログラムを迅速に復元するのに役立ちます。 1. 0xc0000906のエラーは何ですか?エラーコード0xc0000906は、Windowsシステムの一般的な起動例の例外です。これは通常、プログラムが実行中に必要なシステムコンポーネントや実行環境をロードできないことを意味します。この問題は、大規模なソフトウェアやゲームを実行するときに発生することがよくあります。主な理由には、必要なランタイムライブラリがインストールまたは破損していないことが含まれます。ソフトウェアインストールパッケージは無限です

コンピューターは「MSVCP71.DLLがコンピューターから欠落している」とプロンプトします。これは通常、システムに重要な実行コンポーネントがないため、ソフトウェアが正常にロードされないためです。この記事では、ファイルの機能とエラーの根本原因を深く分析し、3つの効率的なソリューションを提供して、プログラムを迅速に実行するのに役立ちます。 1。MSVCP71.dllとは何ですか? MSVCP71.DLLは、Microsoft VisualC 2003のコアランタイムライブラリファイルに属し、Dynamic Link Library(DLL)タイプに属します。これは、主に標準関数、STLテンプレート、および基本的なデータ処理モジュールを呼び出すためにCで記述されたプログラムをサポートするために使用されます。 2000年代初頭に開発された多くのアプリケーションとクラシックゲームは、このファイルに依存して実行されます。ファイルが欠落または破損したら、

Cで正規表現を使用するには、ヘッダーファイルを含めて、パターンマッチングとテキスト処理に提供する機能を使用する必要があります。 1。STD:: regex_matchを使用して完全な文字列に一致し、文字列全体がパターンに準拠している場合にのみtrueを返します。 2。STD:: regex_searchを使用して、文字列の任意の位置で一致を見つけます。 3。STD:: SMATCHを使用してキャプチャグループを抽出し、マッチ[0]、マッチ[1]、およびその後のサブマッチを介して完全な一致を取得します。 4。STD:: regex_replaceを使用して一致するテキストを置き換え、1ドルや2ドルなどの参照でキャプチャグループをサポートします。 5.正規表現を構築するときにISETを追加できます(

Cでのオペレーターの過負荷により、標準演算子の新しい動作をカスタムタイプに割り当てることができます。1。メンバー関数の過負荷を介して新しいオブジェクトを返します。 2。オーバーロード=現在のオブジェクトを変更し、参照を返します。 3。フレンド関数のオーバーロード

std :: vectorの基本的な使用には、次のものが含まれます。1。ベクトルを宣言します。 2. push_back()で要素を追加します。 3。初期化リストで初期化。 4。範囲のループトラバーサル。 5。インデックスまたはback()を介して要素にアクセスします。 6。要素を変更するための値の直接割り当て。 7。fop_back()でエンド要素を削除します。 8。SIZE()を呼び出して、要素の数を取得します。 Constautoを使用し、コピーを避け、リザーブを事前に挿入してパフォーマンスを改善し、アクセス前に空でないことを確認することをお勧めします。このデータ構造は、文字列リストを処理する効率的で好ましい方法です。

Cでは、STD :: MAPおよびSTD :: UNORDERED_MAPの選択は、特定の要件に依存します。 1。根底にある異なる構造:STD :: MAPは赤と黒の木に基づいて実装され、キーは順番、デフォルトの昇順、および検索と挿入の複雑さはo(logn)です。 std :: unordered_mapはハッシュテーブルを使用し、順序ではなく、検索と挿入の平均複雑さはo(1)であり、最悪はo(n)です。 2。挿入性能とメモリオーバーヘッド:マップ挿入には、ツリー構造のメンテナンスが必要であり、効率が低くなります。 UNORDERED_MAPの挿入はより速くなりますが、より多くのメモリを消費し、Reserve()を通じて最適化できます。 3。カスタム比較関数:マップはカスタム比較関数をサポートしています。

STD :: Variantは、C 17によって導入されたタイプセーフユニオンです。指定されたタイプの1つの値を安全に保持できます。 STD :: get、std :: holds_alternative、std :: std :: get_ifなどのメソッドを介した安全なアクセスとタイプチェックを実現できます。 STD ::単一型と組み合わせて、オプションの値をシミュレートできます。 STD ::タイプ分布のためにアクセスし、メンテナンス性を向上させるために大きなタイプのリストを避け、最終的にタイプの安全性と例外の安全性を確保することをお勧めします。

abasicmakefileautomatesc compilation bydefining withtargets、依存関係、およびコマンド
