我有两个选项来创建一个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 回答
请注意,如果
A
实例是单例,则这两个样本仅在功能上等效 . 否则,两个A
值很可能在值上相同但地址不同 . 这将导致不同的语义 .就个人而言,我更喜欢
std::map<A, std::string>
版本,因为它的语义非常清晰 . 键具有相等的语义,并且没有潜在的悬空或nullptr
值 .std::map<A*, std::string>
版本为开发人员查看代码提供了大量问题谁拥有关键值?
A
单身的所有实例?如果不是,我如何确保A
我正在寻找的是存储的A*
值?什么时候释放钥匙?
第一种选择是可取的 . 对于第二种选择,我们需要确保密钥(这里的指针)受到保护 . 可能是共享指针会有所帮助 . 其他问题是 Map 将被缩短w.r.t. A对象的地址,可能不是很有用 . 下面的示例演示了如何定义比较器或者可以覆盖默认比较器: