带有两个不同值的键的c++映射

C++ Map with two keys of different values

本文关键字:映射 c++ 两个      更新时间:2023-10-16

我需要一个映射,它可以有两个键,不同的数据类型,但指向同一个结构体。

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个地图?似乎是浪费。还是需要重载操作符之类的?

您可以使用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,这通常会更有用。

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;

你需要确保不同类型的键不指向相同的数据,这就是为什么我先按类型排序,然后按值排序。