我正在使用外部网络库,它返回一些代表打开的套接字的魔术结构,并且文档说,将它们插入到STL容器时,应该使用std::owner_less
进行比较。我想用unordered_map
代替。我该怎么做? std::owner_less
是一个比较器,它对散列图没有用处。挖掘源代码MagicStructure
似乎是std::shared_ptr
的typedef。C++ 11 unordered_set与std :: owner_less-like哈希
回答
遗憾的是,似乎你必须使用一个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
公开。
http://en.cppreference.com/w/cpp/memory/shared_ptr/owner_before是相关的,因为它使a.get()
从std::owner_less
的排序可以很容易地适用于平等比较(如果两个都不在另一个之前,则a和b相等)。
如果不保证指向同一对象的两个指针从std::shared_ptr
(散列
get()
的结果)的默认散列值应该足够了。
get()
返回相同的值,在一般情况下可能并且在这种特殊情况下似乎是合理的。
散列函数似乎与'owner_less'暗示的等式显式不兼容,因为散列明确给出了'get()'的散列值! –
- 1. 搜索的std ::通过哈希值unordered_set和谓语
- 2. 使用boost ::哈希值来定义的std ::散在C++ 11
- 3. 在C++中声明unordered_set的哈希函数?
- 4. C++旧版本(不是C++ 11) - 地图 - >重写哈希码
- 5. 的std :: unordered_set与自定义分配器
- 6. unordered_set from std
- 7. 哈希表查找 - 与完美哈希,在C
- 8. SURF与哈希
- 9. SQL 2005 MD5哈希和C#MD5哈希
- 10. SQL bigint哈希匹配c#int64哈希
- 11. C#MD5哈希Groovy的MD5哈希
- 12. std ::原子与自定义类(C++ 11)
- 13. 哈希表vs哈希列表与哈希树?
- 14. 哈希与价值
- 15. 哈希一个std ::对,用在unordered_map
- 16. std :: vector比std :: unordered_set更快吗?
- 17. std :: unordered_set insert获取对象
- 18. std :: unordered_set构造函数
- 19. std :: unordered_set允许插入重复记录
- 20. C++ 11 std ::转发指针
- 21. 的std ::哈希专业化使用SFINAE?
- 22. 与哈希符号
- 23. C++ 11 std :: shared_ptr + boost :: serialization
- 24. C++ 11 std :: atomic_fetch_add vs __sync_fetch_and_add
- 25. C++的std :: TR1 ::哈希一个模板类
- 26. MD5和SHA1 C++哈希库
- 27. C#中的哈希表ArrayList#
- 28. sha1哈希不工作? C#
- 29. Java MD5哈希不匹配.NET哈希
- 30. 在std :: set中的顺序和std :: unordered_set的区别
这可能是标准的真正遗漏。我们需要像'owner_equal'和'owner_hash'这样的东西;后者可能是控制块地址的散列。 –
你可以看看源代码,看看他们是否设置了删除,如果是的话,是什么类型。然后尝试'get_deleter'。可能“删除者”可以用作“所有者”的代理。 – Yakk