我正在使用外部網絡庫,它返回一些代表打開的套接字的魔術結構,並且文檔說,將它們插入到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