我正在使用外部网络库,它返回一些代表打开的套接字的神奇结构,并且文档说,当将它们插入到 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。
不幸的是,似乎你必须使用
map
,并且在这种情况下不能使用unordered_map
:http://wg21.cmeerw.net/lwg/issue1406
无法支持基于所有权的等价关系的哈希支持 通过任何用户定义的方式提供,因为有关的信息 用户根本无法共享所有权。因此, 提供基于所有权的哈希支持的唯一方法是提供它 被标准库侵入。
换句话说,
get()
中存储了(由shared_ptr
返回)和拥有的指针(当引用计数达到0时被删除):http://www.cplusplus.com/reference/memory/ Shared_ptr/get/ 。要在 unordered_map
中使用自有指针,您需要基于 hash()
和 equals()
操作的自有指针。但STL中没有提供它们。而且您无法自己实现它们(无需重新实现 shared_ptr
并更改 MagicStructure
的定义),因为 shared_ptr
不会公开所拥有的指针。
std::owner_less
的排序可以很容易地适应相等比较(如果a和b都不先于另一个,则a和b相等)。
std::shared_ptr
get()
的结果)应该足够了。get()
返回相同的值,则不行,这在在这种特殊情况下是一般且合理的。
从C++26开始,将有owner_hash和owner_equal,允许它们存储在无序映射中https://en.cppreference.com/w/cpp/memory/weak_ptr