std ::对象或对象指针的映射?

时间:2014-02-11 18:15:39

标签: c++ class map find

我有两个选项来创建一个std地图。我可以使用这两种类型的地图。

1.    std::map<A, std::string>    
2.    std::map<A*, std::string>

其中A是一个类对象

稍后在代码中我将不得不执行查找操作。

1.    std::map<A, std::string>   myMap1;
          if(myMap1.find(A_obj) != myMap1.end())
          {
          }

2.    std::map<A*, std::string>   myMap2;
          if(myMap2.find(A_obj_ptr) != myMap2.end())
          {
          }

我想知道建议创建哪一个。 在这两个中的哪一个中,我必须重载类A中的任何运算符以使查找操作起作用。当任何操作符未过载时,哪些插入操作会出现问题。

如果有帮助,这是A类

class A
{
    private:
        std::vector<std::string> m_member;

    public:
        A(std::vector<std::string> input);  
};

2 个答案:

答案 0 :(得分:6)

请注意,如果A实例是单例,则这两个样本仅在功能上等效。否则,两个A值很可能在值上相同但地址不同。这将导致不同的语义。

我个人更喜欢std::map<A, std::string>版本,因为它的语义非常明确。键具有相等的语义,并且没有潜在的悬空或nullptr值。 std::map<A*, std::string>版本为开发人员查看代码提供了大量问题

  • 谁拥有关键值?
  • A单身人士的所有实例吗?如果不是,我如何确保A我正在寻找的是存储的A*值?
  • 什么时候释放钥匙?

答案 1 :(得分:0)

首选是首选。对于第二种选择,我们需要确保密钥(这里的指针)受到保护。可能是共享指针会有所帮助。其他问题是地图将被缩短w.r.t. A对象的地址,可能不是很有用。下面的示例演示了如何定义比较器或者可以覆盖默认比较器:

class A 
{
public:
    int a;  
};

namespace std 
{
   template<> 
   struct less<A*>
   {
    bool operator()(const A* const a, const A*  const b) const{
        return a->a < b->a;

   }
};