我想使用function sum(a = 10, b = 7, c) {
return a + b + c;
}
const result = sum(undefined, undefined, 10);
console.log(result);
通过引用比较元素。我试图通过将智能指针作为键插入(因为我不想使用原始指针)来做到这一点,并实现了unordered_map
来比较智能指针的基础引用。但是,地图无法正确找到元素。
EqualFunction
即使我正在搜索同一节点,上述代码也会显示“节点不存在”。
答案 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
“拥有”所包含的对象,也可以使用弱指针,但是这样,您的比较会比较慢(通过“锁定”执行,即从弱指针创建共享指针),将有大量的运行时和内存开销。