C ++ 11 unordered_set with std :: owner_less-like hashing

时间:2015-07-13 07:58:36

标签: c++ c++11 stl shared-ptr unordered-map

我使用外部网络库返回一些表示已打开套接字的魔术结构,文档说当将它们插入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。

2 个答案:

答案 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()的相同值,这在一般情况下是可能的,在这种特殊情况下是合理的。