2015-07-13 126 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()'的散列值! –