我有两个选项来创建一个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);
};
答案 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;
}
};