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

ont*_*cks 5 c++ class map find

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

1.    std::map<A, std::string>    
2.    std::map<A*, std::string>
Run Code Online (Sandbox Code Playgroud)

哪个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())
          {
          }
Run Code Online (Sandbox Code Playgroud)

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

如果有帮助,这是A类

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

    public:
        A(std::vector<std::string> input);  
};
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 6

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

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

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

  • 好问题.如果遵循[Herb Sutter的圣人建议](http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters),原始指针只是非拥有观察者.对于所有权,可以使用合适的智能指针(通常,std :: unique_ptr用于唯一所有权,std :: shared_ptr用于共享所有权). (4认同)