田舎暮らしエンジニアの備忘録

2021.08.01
XML
カテゴリ: C++
C++の std::unordered_map は重複しないパラメータをキーにしてデータを格納しておける便利なやつ。
unordered_mapのキーにはintやcharなど基本的な型だけでなくstd::stringなどよく使うC++ STLのクラスも使える。

しかし、自作した構造体やクラスは単純に使えない。
キーとなるパラメータはハッシュ値に変換されるため、自分でハッシュ変換する関数を用意しないといけない。

ハッシュ関数は (3) の部分に指定する。
std::unordered_map<(1), (2), (3) >


以下、文字列と数値をキーにするサンプルコード



#include <iostream>
#include <string>
#include <unordered_map>

namespace UMap
{
struct Key
    {
std ::string id = {};
int  index = - 1 ;

Key () {}
Key ( const std :: string in_id int in_index )
        {
            id = in_id;
            index = in_index;
        }
    };

inline bool operator== ( const UMap :: Key & map_key1 , const UMap :: Key & map_key2 )
    {
return  ( map_key1 . id  ==  map_key2 . id ) && ( map_key1 . index  ==  map_key2 . index );
    }

struct Hash
    {
inline size_t operator() ( const UMap :: Key & map_key const
        {
const auto  hash1 =  std :: hash < std :: string >()( map_key . id );
const auto  hash2 =  std :: hash < int >()( map_key . index );
return  hash1 ^ (hash2 <<  1 );
        }
    };
};

int main ()
{
std ::unordered_map< UMap ::Key,  std ::string,  UMap ::Hash> umap_data;
UMap ::Key  map_key ( "id_1" ,   2 );
umap_data . emplace (map_key,  "id_1, index_2" );

if  ( umap_data . count (map_key) ==  0 )
    {
std ::cout <<  "key not found"  <<  std ::endl;
    }
else
    {
std ::cout <<  umap_data . find (map_key)-> second  <<  std ::endl;
    }
}



出力​

id_1, index_2

​​



【コスパ最高級】タブレット 10インチ wi-fiモデル 敬老の日 本体 android 10 新品 送料無料 ROM128GB RAM4GB/6GB 1920×1200 WUXGA 8コア 5GHz対応 nanoSIM 4G LTE GPS Bluetooth TECLAST M40SE/M40 ​​
【予約】2021年収穫次第お届け送料無料【信州産 1.8 kg】家庭用 数量限定シャインマスカット 訳あり 3房〜5房入り9月中旬より順次発送いたします。 着日のご指定はできません!





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2021.08.01 15:23:14
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Create a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: