【问题标题】:C++ STL map with a custom class as second type将自定义类作为第二种类型的 C++ STL 映射
【发布时间】:2009-09-25 16:37:29
【问题描述】:

我想创建一个带有 int 和我自己的自定义类的地图。有没有办法做到这一点?

map<int, MyClass> myMap;

如果没有,我该怎么做呢?基本上,我想要一个 id(或者最好是 enum)来指向我自己的自定义类。在大多数其他语言中,这将是一个简单的哈希。

【问题讨论】:

    标签: c++ map


    【解决方案1】:
    #include <map>
    
    std::map<int, MyClass> myMap;
    
    MyClass foo;
    myMap[5] = foo;
    myMap[5].bar = 10;
    

    您确实需要 MyClass 是默认可复制构造的,以便可以创建它(如果您使用,例如 myMap[5])并将其复制到地图中。

    【讨论】:

    • 如果你使用 operator[],我认为你只需要默认构造函数。
    • 甚至可以添加“typedef std::map MyMapType;”
    • 在使用 map 的 [] 运算符时,我们应该注意是否已经存在这个键,否则早期的值将被新值替换,这可能会导致危机
    【解决方案2】:

    是的,唯一的条件是:

    • 密钥类型可比较(良好)
    • 值类型是可复制构造的?

    所以您只需要确保您的对象是可复制构造的,以便可以将其复制到地图中。

    【讨论】:

    • 当然,如果只在映射中存储指向类实例的指针,甚至不需要复制构造函数。
    • @Troubadour:确实如此。但在这种情况下,您正在存储一个指针。 POD 类型的复制构造函数的等价物是简单的赋值(所以我总是将两者等同起来),这只是制作指针的副本。另一个副作用是地图拥有指针而不是对象。地图将释放指针,但不会释放它指向的对象(因此不会删除)。为此,我们有 boost::ptr_map
    【解决方案3】:

    你应该这样使用

    typedef std::map myMapType;

    myMapType myMap;

    但是在插入你的类时要小心,就像你为同一个键插入多次一样,你永远不会收到通知:

    调用 myMapType::iterator itr myMap.find(key) ,具体取决于返回类型和您可以处理的程序要求。

    同样,尝试使用 [] 操作符访问任何元素,如

     somefunc(myMap[10]);
    

    因为即使为键 10 插入了注释,您也不会从地图中收到错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多