1

異なるデータ型の 2 つのキーを持つことができるが、同じ構造体を指すマップが必要です。

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 つのマップを作成する必要がありますか? 無駄に思えます。または、演算子などをオーバーロードする必要がありますか?

4

2 に答える 2

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。これは一般に、より便利です。

于 2014-05-06T17:17:58.347 に答える
1

Astd::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;

異なるタイプのキーが同じデータを指していないことを確認する必要があります。そのため、最初にタイプで並べ替え、次に値で並べ替えます。

于 2014-05-06T18:27:35.190 に答える