C++11 unordered_set 与 std::owner_less 类似散列

问题描述 投票:0回答:3

我正在使用外部网络库,它返回一些代表打开的套接字的神奇结构,并且文档说,当将它们插入到 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。

c++ c++11 stl shared-ptr unordered-map
3个回答
2
投票

不幸的是,似乎你必须使用

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
不会公开所拥有的指针。


0
投票

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

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


0
投票

从C++26开始,将有owner_hash和owner_equal,允许它们存储在无序映射中https://en.cppreference.com/w/cpp/memory/weak_ptr

© www.soinside.com 2019 - 2024. All rights reserved.