4d отображение в C ++? - PullRequest
       0

4d отображение в C ++?

5 голосов
/ 15 февраля 2012

Подскажите, пожалуйста, как я могу написать многомерную карту. Для двумерной карты я сделал следующее:

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

Я пытался использовать что-то похожее на следующее для 4-мерного отображения.

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

Подскажите, пожалуйста, правильный способ сделать это?

Ответы [ 5 ]

6 голосов
/ 15 февраля 2012

Обычно вы хотите объединить все три части ключа в один класс с одним оператором сравнения. Вы можете использовать что-то вроде pair<pair<string, string>, string>, или boost :: tuple, или определить это самостоятельно:

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;
    }
};
4 голосов
/ 15 февраля 2012
map<string, map<string, map<string, int> > > employees;
employees["person1"]["gender"]["age"] = 200;
2 голосов
/ 15 февраля 2012

Вместо этого вы можете использовать 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 голос
/ 15 февраля 2012

Мне нравится такой подход:

std::map<std::tuple<std::string, std::string, std::string>, int> Employees;
Employees[std::make_tuple("person1", "gender", "age")] = 200;
1 голос
/ 15 февраля 2012

Вложенные карты?
map<string, map<string, map<string, int>>> Employees;

или сделать функцию как
findEmployee(string, string, string, int)
потому что это может быть легче вызвать, чем выкопать карту третьего уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...