Std :: mapクラスのfind()関数はどのくらい効率的ですか?それはO(n)であるようなキーを探してすべての要素を反復しますか、それともバランスの取れたツリーにありますか、それともハッシュ関数を使用していますか?
Log(n) これは赤黒木に基づいています。
編集:nはもちろんマップ内のメンバーの数です。
std::map
およびstd::set
は、高度にバランスのとれたバイナリ検索ツリー(赤黒ツリー、AVLツリーなど)を使用してコンパイラベンダーによって実装されます。
Davidが正しく指摘したように、find
はO(log n)時間かかります。ここで、nはコンテナー内の要素の数です。
しかし、それは、文字列ではなく、int
、long
、char
、double
などのプリミティブデータタイプで発生します。
std:string
、たとえばサイズ 'm'がキーとして使用されている場合、バランスのとれた二分探索ツリーの高さをトラバースするには、指定されたキーのlog n comparisonsのエントリが必要です木。
std::string
がstd::map
またはstd::set
のキーである場合、find
およびinsert
操作にはO(m log n)がかかります。ここで、mは見つける必要のある与えられた文字列の長さ。
すべての要素を反復するのではなく、バイナリ検索(O(log(n)))を実行します。検索を実行するには、operator <またはコンパレータを使用します。
ハッシュマップが必要な場合は、std :: unordered_map(C++-0xで追加)を使用できます。これは、ハッシュ関数を使用し、平均して(提供するハッシュ関数とデータに応じて)find()はO(1 )。