2016-09-19 13 views
1

キーが複数の値の組み合わせであるマップをC++にしたい。私はstlとboostの両方を使うことができます。複数の値の組み合わせであるキーを持つマップ

キーの値は、今、このマップは、2つのエントリが含まれていますし、私は以下のようにそれを見つけることができるものでなければならない

typedef value_type int; 
typedef key(string, template(string,int), template(string,int)) key_type; 
typedef map(key_type, value_type) map_type; 

map_type map_variable; 
map_variable.insert(key_type("keyStrning1", 1, "keyString2"), 4); 
map_variable.insert(key_type("keyStrning3", 1, "keyString2"), 5); 

以下のような何か文字列/整数を指定できます

map_variable.find(key_type("keyStrning3", 1, "keyString2")). 

私は、ネストされた使用することができますマップが、私は知ってほしいが、これはブーストまたはC + +のいずれかを使用して任意の便利なソリューションです。

+0

これらのメンバーを持つクラスをキーとして持つことができます。 – Hayt

+1

キーを構造体、あるいはタプルにしたいのですか? ['std :: map'](http://en.cppreference.com/w/cpp/container/map)では、比較演算子を実装するだけです。 –

+0

2番目と3番目のキーは文字列か整数のどちらでもかまいませんか? 'key_type(" ss "、1、" 333 ")は有効なキーで、' key_type( "ss"、 "aa"、1) 'も有効でなければなりません。 –

答えて

3

boost::variant(またはC++ 17の場合はstd::variant)を使用できます。

#include <tuple> 
#include <map> 
#include <utility> 
#include <boost/variant/variant.hpp> 

typedef int ValueType; 
typedef boost::variant<std::string, int> StrOrInt; 
typedef std::tuple<std::string, StrOrInt, StrOrInt> KeyType; 
typedef std::map<KeyType, ValueType> MapType; 

int main(int argc, char *argv[]) { 
    MapType amap; 
    amap.insert(std::make_pair(
       std::make_tuple("string1", "string2", 3), <--- key 
       4)); // <--- value 

    auto finder = amap.find(std::make_tuple("string1", "string2", 3)); 

    std::cout << finder->second << '\n'; // <--- prints 4 

    return 0; 
} 
関連する問題