Карта C ++ с 2 ключами, так что любой 1 ключ может использоваться для получения значения - PullRequest
1 голос
/ 09 июля 2020

У меня есть вариант использования, в котором мне нужно получить значение из карты по ключу. Теперь ключ может быть ID (целое число) или Name (строка).

Я думал о следующей структуре

map1: - ID -> value

map2: - Name -> ID

И спрячьте эту структуру под общей абстракцией, чтобы можно было использовать имя или ID для получения значения.

Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 09 июля 2020

Посмотрите на boost::multi_index. Это позволяет вам создавать контейнеры с любой комбинацией поиска, которую вы хотите.

struct item
{
    int ID;
    std::string Name;
    value_t Value;
};

namespace bmi = boost::multi_index;
using map_t = bmi::multi_index_container<item, bmi::indexed_by<
    bmi::unordered_unique<bmi::tag<struct ID>, bmi::member<item, int, &item::ID>>,
    bmi::unordered_unique<bmi::tag<struct Name>, bmi::member<item, std::string, &item::Name>>
>>;

map_t Map;
/* add some values */
auto idIt = Map.get<ID>().find(1); // lookup by ID
auto nameIt = Map.get<Name>().find("Vaibhav Gupta"); // lookup by Name
...