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_map
:http://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
公开。
我正在使用外部网络库,其中 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 都不在另一个之前,则相等)。
如果指向同一对象的两个指针不是'保证 return 与 std::shared_ptr
的默认散列实现(对 get()
的结果进行散列)应该足够了。get()
相同的值,这在一般情况下是可能的,在这种特殊情况下也是合理的。
不幸的是,您似乎必须使用 map
,而不能在这种情况下使用 unordered_map
:http://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
公开。