我使用外部网络库返回一些表示已打开套接字的魔术结构,文档说当将它们插入STL容器时,应使用std::owner_less
进行比较。
std::map<MagicStructure, std::shared_ptr<Client>, std::owner_less<MagicStructure>> sockets;
但我想改用unordered_map
。我该怎么做? std::owner_less
是一个比较器,对哈希映射没用。挖掘源代码,MagicStructure
似乎是std::shared_ptr
的typedef。
答案 0 :(得分:2)
不幸的是,您似乎必须使用map
,并且无法使用unordered_map
这样的情况:http://wg21.cmeerw.net/lwg/issue1406
哈希支持基于所有权的等价关系不可能 由任何用户定义的方式提供,因为有关的信息 用户根本无法使用所有权共享。因此, 提供基于所有权的哈希支持的唯一方法是提供它 由标准库侵入。
换句话说,在get()
:http://www.cplusplus.com/reference/memory/shared_ptr/get/中存储(由shared_ptr
返回)并拥有指针(在引用计数达到0时删除)。要在unordered_map
中使用拥有指针,您需要拥有基于指针的hash()
和equals()
操作。但是STL没有提供它们。并且您无法自行实现它们(无需重新实现shared_ptr
并更改MagicStructure
的定义),因为shared_ptr
未公开拥有的指针。
答案 1 :(得分:0)
来自std::owner_less
的排序可以很容易地适应相等比较(a和b相等,如果它们都不在另一个之前)。
如果两个指向同一对象的指针不能保证返回来自std::shared_ptr
的默认哈希实现(散列get()
的结果)应该足够了。get()
的相同值,这在一般情况下是可能的,在这种特殊情况下是合理的。