智能指针作为unordered_map键,并通过引用对其进行比较

时间:2018-10-30 10:07:51

标签: c++ smart-pointers unordered-map

我想使用function sum(a = 10, b = 7, c) { return a + b + c; } const result = sum(undefined, undefined, 10); console.log(result);通过引用比较元素。我试图通过将智能指针作为键插入(因为我不想使用原始指针)来做到这一点,并实现了unordered_map来比较智能指针的基础引用。但是,地图无法正确找到元素。

EqualFunction

即使我正在搜索同一节点,上述代码也会显示“节点不存在”。

1 个答案:

答案 0 :(得分:2)

为什么不想使用原始指针?使用它们。智能指针用于管理所有权,而不是指向其他位置创建的对象。

using NodePtr = Node*;

struct HashFunction {
  size_t operator()(const NodePtr& key) const { return (size_t)key; }
};

struct EqualFunction {
  bool operator()(const NodePtr& t1, const NodePtr& t2) const { return t1 == t2; }
};

...

int main()
{
  Node node; Map map;
  auto nodePtr = &node;
  map.insert(nodePtr, 1);
  auto ptrToSameNode = &node;
  if (map.exist(ptrToSameNode)) 
    cout << "Node exists.";
    else cout << "Node doesn't exist.";
}

正如@Piotr Skotnicki在评论中所写,问题是您最初创建了3个Node对象,即node和2个动态分配的对象,它们复制了node(通过{ {1}})。因此,您随后按地址比较了make_shared类的2个不同实例。


或者,您可以使用共享指针,但是您需要动态创建Node对象(而不是像在代码中那样静态地在堆栈上)。如果您不希望自己的Node“拥有”所包含的对象,也可以使用弱指针,但是这样,您的比较会比较慢(通过“锁定”执行,即从弱指针创建共享指针),将有大量的运行时和内存开销。