2012-02-15 1 views
5

多次元地図を書く方法を教えてください。C++での4dマッピング?

map<string, int> Employees 
Employees[“person1”] = 200; 

私は4dマッピングのために次のようなものを使用しようとしていました。

map<string, string, string, int> Employees; 
Employees[“person1”]["gender"][“age”] = 200; 

これを行う正しい方法を教えてください。

+0

は私にさまざまな方法を示したありがとうございました例と一緒に。 –

答えて

4
map<string, map<string, map<string, int> > > employees; 
employees["person1"]["gender"]["age"] = 200; 
+0

ありがとうございました例を示してくれてありがとう –

+0

ようこそ。 –

2

代わりにstd::pairをキーとして使用できます。例えば

、その後のように使用することができ

typedef std::pair<std::string, std::string> key_part; 
typedef std::pair<key_part, std::string> key; 
std::map<key, int> Employees; 

key_part partialKey = std::pair<std::string, std::string>("person1","gender"); 
key myKey = std::pair<key_part, std::string>(partialKey, "age"); 
Employees[myKey] = 200; 
1

ネストされたマップ?
map<string, map<string, map<string, int>>> Employees;

それとも用
findEmployee(string, string, string, int)
のような機能は第3レベルのマップを掘るよりも呼び出すしやすいかもしれませんします。

6

通常、1つの比較演算子を使用して、キーの3つの部分をすべて1つのクラスに結合します。あなたは自分をpair<pair<string, string>, string>ようなものを使用、またはブースト::タプル、またはそれを定義することができ、次のいずれか

class key_type { 
    std::string field1, field2, field3; 
public: 
    bool operator<(key_type const &other) { 
     if (field1 < other.field1) 
      return true; 
     if (field1 > other.field1) 
      return false; 
     if (field2 < other.field2) 
      return true; 
     if (field2 > other.field2) 
      return false; 
     return field3 < other.field3; 
    } 
}; 
1

私はこのアプローチを好む:

std::map<std::tuple<std::string, std::string, std::string>, int> Employees; 
Employees[std::make_tuple("person1", "gender", "age")] = 200;