C++ C++;将自定义类作为第二种类型的STL映射

C++ C++;将自定义类作为第二种类型的STL映射,c++,map,C++,Map,我想用int和我自己的自定义类创建一个映射。有办法做到这一点吗 map<int, MyClass> myMap; map-myMap; 如果没有,我该如何着手实现这一点?基本上,我需要一个id(或者最好是enum)来指向我自己的自定义类。在大多数其他语言中,这将是一个简单的哈希 #include <map> std::map<int, MyClass> myMap; MyClass foo; myMap[5] = foo; myMap[5].bar =

我想用int和我自己的自定义类创建一个映射。有办法做到这一点吗

map<int, MyClass> myMap;
map-myMap;
如果没有,我该如何着手实现这一点?基本上,我需要一个id(或者最好是
enum
)来指向我自己的自定义类。在大多数其他语言中,这将是一个简单的哈希
#include <map>

std::map<int, MyClass> myMap;

MyClass foo;
myMap[5] = foo;
myMap[5].bar = 10;
std::map myMap; MyClass foo; myMap[5]=foo; myMap[5].bar=10;
您确实需要将
MyClass
设置为默认和可复制的可构造类,以便可以创建它(如果您使用,例如
myMap[5]
)并将其复制到映射中。

是唯一的条件是:

  • 钥匙类型具有可比性(良好)
  • 值类型是可复制构造的吗

因此,您只需要确保您的对象是可复制构造的,以便可以将其复制到映射中。

您应该这样使用

typedef std::map myMapType

myMapType myMap

但是,在这种情况下插入类时要小心,因为如果为同一个键插入多次,则永远不会收到通知:

调用myMapType::迭代器itr myMap.find(键),这取决于返回类型和您可以处理的程序要求

Like-wise尝试使用[]运算符Like访问任何元素

 somefunc(myMap[10]);

由于即使为键10插入了注释,您也不会从映射中得到错误,因此我认为如果您使用运算符[],您只需要默认构造函数。甚至可以添加“typedef std::map MyMapType;”在对映射使用[]运算符时,如果该键已经存在,我们应该注意,否则早期值将被新值替换,这可能会导致crisisOf过程,如果只在映射中存储指向类实例的指针,那么您甚至不需要复制构造函数。@Troubadour:有点像真的。但在这种情况下,您存储的是一个指针。POD类型的复制构造函数的等价物是简单赋值(因此我总是将两者等同),这只是复制指针。另一个影响是贴图拥有指针而不是对象。贴图将释放指针,但不会释放它所指向的对象(因此不会删除)。为此,我们有boost::ptr_映射