C ++ unordered_mapカスタムキー

C ++ 11のようなhash_map、馴染みhash_set前unordered_set、unordered_map、unordered_multiset、unordered_multimap、すなわちハッシュコンテナクラスを含む追加。

そのようなunordered_map容器の使用によって導入ハッシュテーブルの基礎となる実装、このような容器。

unordered_mapは、テンプレートクラスで、私たちは5つのルービックマジックパラメータを提供する必要があります。次のキー値の種類、値のタイプの値が、ハッシュ関数、同等の機能、容器ディスペンサー。最後の3つはそれらのデフォルトパラメータは、その後、我々はあなたがそれを使用することができます最初の二つのテンプレートパラメータを提供する必要はありませんか?必ずしもそうではありません。私たちが使用している場合STL内の3つのパラメータのデフォルトのテンプレート特殊があるその背後とき、内蔵キーのタイプ(例えば、int型、ダブル、フロート、文字列など)を、それを直接使用することができます。しかし、一度同じハッシュを持っているし、自分を提供するカスタムタイプ、など、あなたのクラス。実際に理解することは、難しいことではない、あなたのターゲットと仮定すると石は、ハッシュ、どのようにそれよりもどのように石の大きさだったか、石のですか?コンパイラはもちろん、知らないので、あなたは、コンパイラに指示する必要があります。これらの2つの場合はそれぞれ、説明しましょう。

キーは、内蔵されたタイプ(A)、:

unordered_map <文字列、整数> m_map; 

ときの組み込み型のキータイプは、キーの値を使用することができます提供のみ必要です。ハッシュ<ストリング>と<整数>等しい特殊なバージョン、コンテナ全体のメモリ管理の代理店である場合、これら3つのパラメータはデフォルトパラメータです。

(B)、カスタムタイプのキー:

  例えば、我々は単に名前だけで、携帯電話2つのデータであるパッケージタイプを定義します。

クラスのパッケージ
{ 
パブリック文字列のgetName()constの { リターン名。}
     長い  getPhone()のconst { リターン電話。} 

    パッケージ(文字列 M_NAME = 0長い 長い m_pNum = 0 )。

    ブール 演算子 ==(CONSTパッケージ&P)のconst 
    {     戻り名== p.name && 
               電話 == p.phone。
    } 

プライベート文字列の名前。        
    長い 長い電話。        
}。

ネイティブのハッシュを使用するには、次のパッケージ:

名前空間STD 
{ 
    テンプレート <>
     構造体ハッシュ<パッケージ> 
    { 
        size_tの演算子()(CONSTパッケージ&S)CONST noexcept 
        { 
            戻り   ハッシュ<decltype(s.getName())>()(s.getName())+ 
                    ハッシュ <decltype( s.getPhone())> ()(s.getPhone())。
        } 
    }。// 间接调用原生ハッシュ。
}

それとも、援助ブーストライブラリHASH_VALUEを利用することができます。

名前空間STD 
 { 
     テンプレート <>
      構造体ハッシュ<パッケージ> 
     { 
         size_tの演算子()(CONSTパッケージ&S)CONST noexcept 
         { 
             オートT = make_tuple(s.getName()、s.getPhone())。                                            
             size_tの値 = ブースト:: HASH_VALUE(T)。         
             戻り値;     // make_tuple(s.getName()、s.getPhone())等价于タプル<文字列、長い長い>()(s.getName()、s.getPhone())
          } 
     }。// 间接调用原生ハッシュ。
  }

ときにハッシュ関数我々(パッケージの日本語版)と同等の機能(==演算子のオーバーロード)提供は、unordered_mapのカスタマイズバージョンを使用することができます。

unordered_map <パッケージ、int型> m_map。

テストコードを以下に示します:

テスト環境:VS2017

書式#include <iostreamの> 
の#include <unordered_map> 
書式#include < 文字列 > 
の#include <アルゴリズム>
 // する#include <ブースト/機能/ hash.hpp>    // 根据安装路径选择hash.hpp 
する#include <タプル> 使用して名前空間はstd ; クラスのパッケージ
{ パブリック文字列のgetName()constの { リターン名。}
     長い getPhone()のconst { リターン電話。} 
    パッケージ(文字列 M_NAME = 0

 



 
長い 長い m_pNum = 0 )。

    ブール 演算子 ==(CONSTパッケージ&P)のconst 
    {     戻り名== p.name && 
               電話 == p.phone。
    } 

プライベート文字列の名前。        
    長い 長い電話。        
}。

パッケージ::パッケージ(文字列 M_NAME、長い 長いm_pNum) 名前(M_NAME)、電話(m_pNum){} 

名前空間のstd 
{ 
    テンプレート <>
     構造体のハッシュ<パッケージ>
    { 
        size_tの演算子()(CONSTパッケージ&S)CONST noexcept 
        { 
            戻り   ハッシュ<decltype(s.getName())>()(s.getName())+ 
                    ハッシュ <decltype(s.getPhone())> ()(S .getPhone())。
            
            // 自動T = make_tuple(s.getName()、s.getPhone())。                                            
            // size_tの値=ブースト:: HASH_VALUE(T);         
            // 戻り値;     // make_tuple(s.getName()、s.getPhone())等价于タプル<文字列、長い長い>()(s.getName()、s.getPhone())
        } 
    }。// 间接调用原生ハッシュ。
} 

int型のmain()
{ 
    unordered_map <パッケージ、INT > m_map。

    パッケージP1 { " "13399996666 }。
    パッケージP2 { " "13399993333 }。
    パッケージP3 { " "13399992222 }。
    パッケージP4 { " "13399991111 }。
    パッケージP5 { " "13399996666 }。
    パッケージP6 { "; 
    コスト

    << m_map.bucket(P5)<< "  " 
    coutの << m_map.bucket(P6)<< "  " << てendl; 

    リターン 0 ; 
}

これは、切り替えます。https://www.cnblogs.com/xiguas/p/9977933.html

おすすめ

転載: www.cnblogs.com/Malphite/p/11568661.html