我需要一张地图,它可以有两个不同数据类型的键,但指向相同的结构。
struct DataStruct {
SomeEnum keyEnum; // <---- key as enum
std::string keyString; // <----- a key as a string
int arbitrarydata;
int moredata;
}
然后我想要std::map
我可以看起来像:
std::map<SomeEnum||std::string, DataStruct> dataMap;
dataMap[SomeEnum::AValue] = dataStruct1;
dataMap["mykey"] = dataStruct2;
这是可能的还是我需要制作2张地图?似乎是浪费。或者我是否需要重载运算符或什么?
答案 0 :(得分:1)
您可以使用std::pair
,如下所示:
#include <iostream>
#include <map>
#include <utility>
typedef enum {A, B, C} en;
int main ()
{
en myen = A;
std::map<std::pair<char,int>, int> mymap;
mymap.insert ( std::pair<std::pair<char, int>,int>(std::make_pair('a',myen),200) );
mymap.insert ( std::pair<std::pair<char, int>,int>(std::make_pair('z',30),400) );
// showing contents:
std::cout << "mymap contains:\n";
for (std::map<std::pair<char,int>, int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << "(" << it->first.first << ", " << it->first.second <<
") => " << it->second << '\n';
return 0;
}
问题中没有答案:
请注意,在C ++ 11中,您可以使用enum class
,这通常会更有用。
答案 1 :(得分:1)
std::map
只能拥有相同类型的键,但您可以使用您想要的任何键逻辑来欺骗它。请确保他们可以正确比较:
struct DataStruct {
struct Key {
std::string keyString;
SomeEnum keyEnum;
int type;
Key(SomeEnum a) : keyEnum(a), type(0) { }
Key(const char * a) : keyString(a), type(1) { }
bool operator<(const Key & o) const {
if (type != o.type) return type < o.type;
else return type == 0 ? keyEnum < o.keyEnum : keyString < o.keyString;
}
};
int data;
}
然后你可以按照你想要的方式使用它:
std::map<DataStruct::Key, DataStruct> dataMap;
dataMap[SomeEnum::AValue] = dataStruct1;
dataMap["mykey"] = dataStruct2;
您需要确保不同类型的密钥不指向相同的数据,这就是为什么我首先按类型排序,然后按其值排序。