C++ unordered_map

14763 ワード

unordered_mapの定義
template < class Key,
class T,
class Hash = hash<Key>,
class Pred = equal_to<Key>,
class Alloc = allocator< pair<const Key,T> >> class unordered_map;

テンプレートパラメータの説明:
キーのタイプ.クラステンプレートの内部でkey_という別名を使用typeのメンバータイプ.Tがマッピングされる値のタイプ.クラステンプレートの内部で、別名mapped_を使用typeのメンバータイプ.Hash 1元述語は、キータイプのオブジェクトをパラメータとして、そのオブジェクトに基づくsize_を返します.tタイプの一意の値.関数ポインタ(Function pointer)タイプまたは関数オブジェクト(Function object)タイプであってもよい.クラステンプレートの内部で、hasherという別名を持つメンバータイプを使用します.Pred 2元述語は、2つのKeyタイプのオブジェクトをパラメータとして、最初のパラメータが2番目のパラメータに等価である場合、bool値がtrueである場合、falseである場合のbool値を返します.デフォルトはstd::equal_to.関数ポインタタイプ(Function pointer)タイプまたは関数オブジェクト(Function object)タイプであるもよい.クラステンプレートの内部でkey_という別名を使用equalのメンバータイプ.Allocコンテナの内部では、メモリの割り当てと解放を管理するメモリディスペンサのタイプが使用されます.このパラメータはオプションで、デフォルト値はstd::allocatorです.これは最も簡単な非値依存メモリディスペンサです.クラステンプレートの内部で、別名allocator_を使用します.typeのメンバータイプ.
特長
unordered_mapは関連容器でkey,valueを格納する.要素には特に順序関係の特徴はありません:1.関連付けられたコンテナ内の要素は、コンテナ内の絶対位置ではなく、プライマリ・キー(Key)によって参照されます.2.無秩序(Unordered)無秩序コンテナは、hashテーブルを介して要素を整理し、プライマリ・キーを介して要素に迅速にアクセスできます.3.マップ(Map)各要素は1つの値(Mapped value)としてキー(Key)をバインドする:プライマリ・キーでプライマリ・コンテンツがマップされた値に等しい要素を示す.4.キーユニーク(Unique keys)コンテナには、同じプライマリ・キーを持つ2つの要素は存在しません.5.メモリディスペンサを感知できる(Allocator-aware)コンテナは、メモリディスペンサオブジェクトを使用して、そのストレージ要件を動的に処理する.
unordered_map内部では、要素は任意の順序でソートされるのではなく、プライマリ・キーのhash値によって要素を各スロット(Bucket、または「バケツ」)にグループ化することで、プライマリ・キーを介して各対応する要素(平均消費時間は定数、すなわち時間複雑度はO(1))に迅速にアクセスできます.
メンバー関数
===============================================================================================================================cendは、コンテナの最後の位置を指す通常反復器======================================================sizeは、有効な要素の個数maxを返します.sizeはunorderedを返します.mapでサポートされている最大要素数emptyは、空であるか否かを判断します=============================================================================================================================hintプロンプトによる要素の構築と挿入==========================================find与えられたプライマリ・キーに一致する要素の個数equal_を返すrangeは、指定された検索値に一致する値を返す要素の範囲========================================================================count戻りスロット数max_bucket_countは最大スロット数bucket_を返します.size戻りスロットサイズbucket戻り要素が存在するスロットのシーケンス番号load_factorはロードファクタ、すなわち1つの要素スロットの最大要素数max_を返します.load_factor最大ロードファクタrehash設定スロット数reserve要求コンテナ容量の変更
テスト
#include 
#include 
#include 

using namespace std;

void PrintIntDoubleUnOrderedMap(unordered_map<int, double>& m, char* pre)
{
    unordered_map<int, double>::iterator iter;
    cout << pre;
    for (iter = m.begin(); iter != m.end(); ++iter)
        cout << "(" << iter->first << ", " << iter->second << ")" << " ";
    cout << endl;
}

void UnOrderedMapExp1()
{
    unordered_map<int, double> m;
    //  key,     
    m[0] = 1.11;
    //    ,      
    m.insert(unordered_map<int, double>::value_type(1, 2.22));
    //      ,pair       unordered_map
    m.insert(m.end(), pair<int, double>(2, 3.33));
    PrintIntDoubleUnOrderedMap(m, "       m:");

    //      
    unordered_map<int, double> m2;
    m2.insert(unordered_map<int, double>::value_type(3, 4.44));
    m2.insert(unordered_map<int, double>::value_type(4, 5.44));
    m2.insert(unordered_map<int, double>::value_type(5, 6.44));
    m.insert(m2.begin(), m2.end());

    m.emplace(6, 5.55);
    m.emplace_hint(m.end(), 7, 3.09);
    m.at(5) = 3.333333;

    PrintIntDoubleUnOrderedMap(m, "      m:");

    unordered_map<int, double>::iterator iter;
    iter = m.find(4);
    if (iter != m.end())
    {
        cout << "m.find(4): ";
        cout << "(" << iter->first << ", " << iter->second << ")" << endl;
    }

    if (iter != m.end())
    {
        m.erase(iter);
    }
    PrintIntDoubleUnOrderedMap(m, "     4     m:");

    //    
    for (iter = m.begin(); iter != m.end(); ++iter)
    {
        if (iter->first == 2)
        {
            m.erase(iter);
            break;
        }
    }

    //    
    cout << "bucket_count:" << m.bucket_count() << endl;
    cout << "max_bucket_count:" << m.max_bucket_count() << endl;
    cout << "bucket_size:" << m.bucket_size(0) << endl;
    std::cout << "load_factor:" << m.load_factor() << std::endl;
    std::cout << "max_load_factor:" << m.max_load_factor() << std::endl;
    PrintIntDoubleUnOrderedMap(m, "     2     foo1:");
    m.clear();
    PrintIntDoubleUnOrderedMap(m, "    foo1:");
}

int main()
{
    UnOrderedMapExp1();

    return 0;
}

クラスをキーとしてvalue
STLが提供する基本タイプint,char,longなどとstringzだけをkey,value,STLとしてハッシュ関数と比較関数を提供する.しかし、自分で定義したクラスを使用する場合は、ハッシュ関数と比較関数を自分で定義する必要があります.
//hash  
template <typename T>  
class hash  
{  
    public:  
        size_t operator()(const T& o) const { return 0; }  
};  

//compare  
template <typename T>  
class equal_to  
{  
  public:  
    bool operator()(const T& a, const T& b) const { return a == b; }  
};  

次に、学号の名前を例に挙げて実現します.
#include 
#include 
#include 

using namespace std;

//     ,  key value


//  
class Number
{
    string str;
public:
    Number() { }
    Number(string s) { str = s; }

    const string& get() const
    {
        return str;
    }
};

//  
class Name 
{
    string str;
public:
    Name() {}
    Name(string s) { str = s; }

    const string& get() const
    {
        return str;
    }
};


//        
//    const
class MyHash 
{
public:

    size_t operator()(const Number& num) const
    {
        hash<string> sh;        //  STL hash
        return sh(num.get());
    }
};

//  equal_to  
//   const
class MyEqualTo {
public:

    bool operator()(const Number& n1, const Number& n2) const
    {
        return n1.get() == n2.get();
    }
};

int main()
{
    unordered_map map;
    map.emplace(Number("1000"), Name("A"));
    map.emplace(Number("1001"), Name("G"));
    map.emplace(Number("1002"), Name("E"));
    map.emplace(Number("1003"), Name("D"));


    unordered_map::iterator iter;
    Number num("1001");
    iter = map.find(num);

    if (iter != map.end())
        cout << "Number: " << iter->first.get() << "," << "Name: " << iter->second.get() << endl;

    else
        cout << "Not found!" << endl;

    return 0;
}

参照先:http://www.cplusplus.com/reference/unordered_map/unordered_map/