C++11 unordered_set 与 std::owner_less-like 散列

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

我正在使用外部网络库,其中 returns 一些神奇的结构代表打开的套接字,文档说当将它们插入 STL 容器时,应该使用 std::owner_less.[=18 来比较它们=]

std::map<MagicStructure, std::shared_ptr<Client>, std::owner_less<MagicStructure>> sockets;

不过我想改用 unordered_map。我该怎么做? std::owner_less 是一个比较器,它对哈希映射没有用。挖掘源代码,MagicStructure 似乎是 std::shared_ptr.

的类型定义

std::owner_less 的顺序可以很容易地适应相等比较(如果 a 和 b 都不在另一个之前,则相等)。

std::shared_ptr 的默认散列实现(对 get() 的结果进行散列)应该足够了。 如果指向同一对象的两个指针不是'保证 return 与 get() 相同的值,这在一般情况下是可能的,在这种特殊情况下也是合理的。

不幸的是,您似乎必须使用 map,而不能在这种情况下使用 unordered_maphttp://wg21.cmeerw.net/lwg/issue1406

Hash support for the ownership-based equivalence relation cannot be provided by any user-defined manner because information about ownership sharing is not available to users at all. Therefore, the only way to provide ownership-based hash support is to offer it intrusively by the standard library.

换句话说,在 shared_ptr: http://www.cplusplus.com/reference/memory/shared_ptr/get/ 中有存储(由 get() 返回)和拥有的指针(当引用计数达到 0 时删除)。要在 unordered_map 中使用自有指针,您需要基于自有指针的 hash()equals() 操作。但它们在STL 中没有提供。而且你不能自己实现它们(不重新实现 shared_ptr 并更改你的 MagicStructure 的定义)因为拥有的指针没有被 shared_ptr 公开。