gpt4 book ai didi

c++ - 如何制作 std::weak_ptr 的 c++11 std::unordered_set

转载 作者:可可西里 更新时间:2023-11-01 15:38:16 28 4
gpt4 key购买 nike

我有一个这样的集合:set<weak_ptr<Node>, owner_less<weak_ptr<Node> > > setName;

它工作正常。但我想将其更改为无序集。但是,当我这样做时,我得到了大约六页错误。有什么想法吗?

在查看所有页面的错误消息后,我找到了可能有帮助的行。

/usr/include/c++/4.7/bits/functional_hash.h:60:7: error: static assertion failed: std::hash is not specialized for this type
/usr/include/c++/4.7/bits/stl_function.h: In instantiation of ‘bool std::equal_to<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::weak_ptr<Node>]’:

最佳答案

简短而不幸的答案是,虽然 shared_ptr<>可以安全地用作无序集合或映射中的键,weak_ptr<>不能也不能。再多的诡计也无法保证安全。

这是因为weak_ptr的接口(interface)不暴露对共享控制对象的访问,这是owner_before()比较的基础。在有序集合或映射中使用时。

虽然锁定指针然后散列 shared_ptr 似乎是合理的, 它不是。如果最后shared_ptr超出范围哈希值将更改,这将导致下次迭代集合或映射时出现未定义的行为。这很可能不会被注意到,直到您的代码在客户面前投入生产,您偶尔会遇到意外和莫名其妙的功能损失,但您的单元测试仍然会完美通过,让您误以为您的测试覆盖率很好,您的代码是可靠的,应该归咎于用户、硬件或网络。

因此,总而言之,如果您要使用 weak_ptr要构建您的非拥有对象缓存(它们非常出色),您需要使用 std::set<weak_ptr>并遭受微小的性能损失(尽管实际上这与保护集合的 mutex 造成的性能损失相比相形见绌)。

如果你真的想使用 weak_ptr作为无序键,您必须自己编写(提示:使用共享控制 block 的地址作为哈希函数的基础)。

关于c++ - 如何制作 std::weak_ptr 的 c++11 std::unordered_set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com