C++ C++;使用两个不同值的键进行映射

C++ C++;使用两个不同值的键进行映射,c++,dictionary,key,multiple-definition-error,C++,Dictionary,Key,Multiple Definition Error,我需要一个地图,可以有两个键,不同的数据类型,但指向同一个结构 struct DataStruct { SomeEnum keyEnum; // <---- key as enum std::string keyString; // <----- a key as a string int arbitrarydata; int moredata; } 这是可能的还是我需要制作两张地图?似乎是浪费。或者我需要重载操作符还是什么?您可以使用std:

我需要一个地图,可以有两个键,不同的数据类型,但指向同一个结构

struct DataStruct {
   SomeEnum keyEnum;      // <---- key as enum
   std::string keyString;  // <----- a key as a string

   int arbitrarydata;
   int moredata;
}

这是可能的还是我需要制作两张地图?似乎是浪费。或者我需要重载操作符还是什么?

您可以使用
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;
}
#包括
#包括
#包括
typedef枚举{A,B,C}en;
int main()
{
en-myen=A;
std::map mymap;
mymap.insert(std::pair(std::make_pair('a',myen),200));
mymap.insert(std::pair(std::make_pair('z',30),400));
//显示内容:

std::coutA
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;
}
struct数据结构{
结构键{
std::字符串键串;
SomeEnum-keyEnum;
int型;
Key(SomeEnum a):keyEnum(a),类型(0){
键(constchar*a):键串(a),类型(1){}

bool Operator您考虑过Boost的容器吗?我必须研究一下,它通常看起来是一个不错的解决方案,尽管这是针对嵌入式系统的,所以不确定我可以将多少Boost拖到其中。如果您不需要Boost的全部功能,请尝试包装您自己的。
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;