首页 文章

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

提问于
浏览
5

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

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())
          {
          }

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

如果有帮助,这是A类

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

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

2 回答

  • 0

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

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

    • 谁拥有关键值?

    • A 单身的所有实例?如果不是,我如何确保 A 我正在寻找的是存储的 A* 值?

    • 什么时候释放钥匙?

  • 6

    第一种选择是可取的 . 对于第二种选择,我们需要确保密钥(这里的指针)受到保护 . 可能是共享指针会有所帮助 . 其他问题是 Map 将被缩短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;
    
       }
    };
    

相关问题