2015-07-13 123 views
9

我正在使用外部网络库,它返回一些代表打开的套接字的魔术结构,并且文档说,将它们插入到STL容器时,应该使用std::owner_less进行比较。我想用unordered_map代替。我该怎么做? std::owner_less是一个比较器,它对散列图没有用处。挖掘源代码MagicStructure似乎是std::shared_ptr的typedef。C++ 11 unordered_set与std :: owner_less-like哈希

+0

这可能是标准的真正遗漏。我们需要像'owner_equal'和'owner_hash'这样的东西;后者可能是控制块地址的散列。 –

+0

你可以看看源代码,看看他们是否设置了删除,如果是的话,是什么类型。然后尝试'get_deleter'。可能“删除者”可以用作“所有者”的代理。 – Yakk

回答

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公开。

+1

http://en.cppreference.com/w/cpp/memory/shared_ptr/owner_before是相关的,因为它使a.get() Yakk

0

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

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

+4

散列函数似乎与'owner_less'暗示的等式显式不兼容,因为散列明确给出了'get()'的散列值! –