Multimapの実用化

3463 ワード

Multimapの実用化
mapから引き出された問題
最近、「C++同時プログラミング実戦」を見て、細粒度のMAPデータ構造を実現するには、ハッシュテーブルしか使用できないと述べた.そしてtableの中のpair()ではkeyとvalueが1つずつ対応しているので,バックグラウンドメモリにユーザID(key)からなるユーザ状態マルチスレッドを作成して発表することができる.そして思いましたが、multimapの実際の役割は何ですか?それから詰まって、インターネットで調べて、私は以下の例を得ました:例えば電話帳の中で同じ人は2つ以上の電話番号を持つことができて、ファイルシステムの中で複数の記号のリンクを同じ物理ファイルにマッピングすることができて、あるいはDNSサーバーはいくつかのURLsを同じIPアドレスに映すことができます.
この記事では、mapとmultimapは同じインタフェースを持っているが、その重要な違いは重複キーであり、設計と使用は区別しなければならないと結論した.また,各コンテナ内のinsert()メンバー関数の微細な違いにも注意する.STLのmultimap使用概要.
この記事では,Insert問題の検討を通して,VS 2013環境において無秩序関連容器のバケツサイズは8のn次方であり,bucket_count()とmax_bucket_count()は等しく,このテストにより,(1)無秩序関連容器におけるバケツの大きさの確立はコンパイラの実現に関係する(この点,このリンクをクリックしてリンクを開くことができる);(2)無秩序関連容器の底層の真の実装は,バケツごとに1つの要素しか保存されず,同じキーワードを持つ要素が隣接するバケツを構成するという1次元Hash配列である.unordered_Multimapのinsert問題
C++では、multimapでkeyがいくつかのvalueに対応している場合、どのように対応するvalueを一つ一つ出力するかを簡単に紹介します.
#include 
#include 
#include 
using namespace std;

int main()
{
    multimap<string,int> m_map;
    string s("  "),s1("  ");
    m_map.insert(make_pair(s,50));
    m_map.insert(make_pair(s,55));
    m_map.insert(make_pair(s,60));
    m_map.insert(make_pair(s1,30));
    m_map.insert(make_pair(s1,20));
    m_map.insert(make_pair(s1,10));
    //  1
    int k;
    multimap<string,int>::iterator m;
    m = m_map.find(s);
    for(k = 0;k != m_map.count(s);k++,m++)
        cout<first<<"--"<second<//  2
    multimap<string,int>::iterator beg,end;
    beg = m_map.lower_bound(s1);
    end = m_map.upper_bound(s1);
    for(m = beg;m != end;m++)
        cout<first<<"--"<second<//  3
    beg = m_map.equal_range(s).first;
    end = m_map.equal_range(s).second;
    for(m = beg;m != end;m++)
        cout<first<<"--"<second<return 0;
}