C++ C++;使用两个键进行映射,这样任何一个键都可以用来获取值

C++ C++;使用两个键进行映射,这样任何一个键都可以用来获取值,c++,unordered-map,C++,Unordered Map,我有一个用例,在这个用例中,我必须从给定键的映射中获取一个值。 现在,键可以是ID(整数)或Name(字符串) 我考虑了以下结构 映射1:-ID->value 地图2:-名称->标识 并将此结构隐藏在公共抽象下,以便可以使用名称或ID检索值 有更好的方法吗?看看。它允许您使用所需的任何查找组合创建容器 struct item { int ID; std::string Name; value_t Value; }; namespace bmi = boost::mult

我有一个用例,在这个用例中,我必须从给定键的映射中获取一个值。 现在,键可以是ID(整数)或Name(字符串)

我考虑了以下结构

映射1:-ID->value

地图2:-名称->标识

并将此结构隐藏在公共抽象下,以便可以使用名称或ID检索值

有更好的方法吗?

看看。它允许您使用所需的任何查找组合创建容器

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
struct项
{
int-ID;
std::字符串名;
价值(t)价值;;
};
命名空间bmi=boost::multi_索引;
使用map_t=bmi::multi_index_container>;
地图;
/*添加一些值*/
auto idIt=Map.get().find(1);//按ID查找
auto nameIt=Map.get().find(“Vaibhav Gupta”);//按名称查找
看一看。它允许您使用所需的任何查找组合创建容器

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
struct项
{
int-ID;
std::字符串名;
价值(t)价值;;
};
命名空间bmi=boost::multi_索引;
使用map_t=bmi::multi_index_container>;
地图;
/*添加一些值*/
auto idIt=Map.get().find(1);//按ID查找
auto nameIt=Map.get().find(“Vaibhav Gupta”);//按名称查找

是否存在从整数ID键到字符串名称ID键的1-1关系?我想不会,所以你不需要第二张地图。我认为这个想法很好,但请记住以有效的方式管理这两个地图,因此如果在地图1中删除了一个ID,您想对地图2做什么?删除条目?然后你必须迭代这些值,把它留在那里,不要碰它?可能会导致未使用的内存,可能会导致重复输入。根据这一点,实现您的想法,请在发布之前阅读,考虑使用Stutt{int ID,String Ne}}作为map的键。关于如何实现这一点的想法可以从这里得到:@TomasŠvedas我也想到了
std::pair
,但是如果您只给出了ID或名称,您将如何找到条目?只需对first.ID==second.ID | | first.name==second.name进行==运算符检查就可以了字符串名称ID键?我想不会,所以你不需要第二张地图。我认为这个想法很好,但请记住以有效的方式管理这两个地图,因此如果在地图1中删除了一个ID,您想对地图2做什么?删除条目?然后你必须迭代这些值,把它留在那里,不要碰它?可能会导致未使用的内存,可能会导致重复输入。根据这一点,实现您的想法,请在发布之前阅读,考虑使用Stutt{int ID,String Ne}}作为map的键。关于如何实现这一点的想法可以从这里得到:@TomasŠvedas我也想到了
std::pair
,但是如果您只给出了ID或名称,您将如何找到条目?只需对first.ID==second.ID | | first.name==second.name进行==运算符检查即可