2016-09-27 13 views
2

1つまたは複数のキー(例えば、intstd::stringで構築されたキーのような)に基づいて数値データを収集するデータコンテナが必要です。複数のキー/値を持つ順序付けられていないコンテナ

複数の値を収集する必要がある場合は、1つのキーについては、それぞれunordered_map<std::string, int>unordered_map<std::string, List<int>>を使用できます。

複数のキーを持つことはどうですか?他の投稿ではstd::make_pair<type1, type2>をキーとして使用するように勧められましたが、これは2つのキーでのみ機能し、ちょっとハッキリに見えます。

複数の変数と複数の値が割り当てられたキーを使用することができる、使いやすいデータ構造またはライブラリがありますか?値はキーによってアクセス可能でなければなりません(値にアクセスするためのいくつかのインターフェースを提供するboost :: multi_indexのようなものは必要ありません)。さらに、コンテナ内で値をソートしてはいけませんが、データ処理中に値が増減するため、高速アクセスが望まれます。

+0

最終的に複数のキー値に 'std :: tuple'を使用しますか?これが可能かどうかは分かりません。 –

+4

複数のメンバを持つ構造体を作成し、それをキーとして使用すると、必要な演算子がオーバーロードされている限り正常に動作します。 –

+0

@GillBates私は、等価演算子std :: hash以外の順序付けられていないコレクションの場合には、特殊化する必要があると考えています... –

答えて

3

std :: tupleを同じものに使用できます。タプル比較は、ほとんどすべての組み込み型の複数の要素に対して機能します。例

typedef tuple<int, int> tx; 
tx t1 = make_tuple(1, 1); 
tx t2 = make_tuple(1, 2); 

if (t1 == t2) { 
     cout << "EQUAL" << endl; 
} 

または

typedef tuple<string, string> tx; 
    tx t1 = make_tuple("AB", "CD"); 
    tx t2 = make_tuple("AB", "CD"); 

    if (t1 == t2) { 
     cout << "EQUAL" << endl; 
    } 

使用あなたが

unordered_mapにキーとしてタプルのためにマップを使用する例が

map<tx, int> mp; 
mp[make_tuple("AB", "CD")] = 100; 
mp[make_tuple("EF", "GH")] = 200; 

は、既存のキーを更新することができ、我々は使用することができます

mp[t1] = 300; 
+0

タプルで試したところ、ハッシュ関数を実装する必要がありました。だから、構造体を使う代わりに、基本的に同じ努力が必要ですか? – Patrick

+0

いいえ、あなたはこのような地図を書くことはできません。 –

+0

typedef tuple <文字列、文字列> tx; \t tx t1 = make_tuple( "AB"、 "CD"); \t tx t2 = make_tuple( "AB"、 "CD"); \t if(t1 == t2){ \t \tcout << "EQUAL" << endl; \t} \t map mp; \t mp [make_tuple( "AB"、 "CD")] = 100; \t mp [make_tuple( "EF"、 "GH")] = 200; \t mp [t1] = 300; –

関連する問題