3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
明確允許并鼓勵(lì)您向名稱空間* 添加特殊化std。添加哈希函數(shù)的正確方法(基本上是唯一方法)是:
namespace std {
template <> struct hash<Foo>
{
size_t operator()(const Foo & x) const
{
/* your code here, e.g. "return hash<int>()(x.value);" */
}
};
}
(您可能考慮支持其他受歡迎的專業(yè)有std::less,std::equal_to和std::swap。)
*)我想,只要其中一種涉及類型是用戶定義的即可。

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
我的賭注將放在unordered_map / unorder_set / ...類的Hash模板參數(shù)上:
#include <unordered_set>
#include <functional>
struct X
{
int x, y;
std::size_t gethash() const { return (x*39)^y; }
};
typedef std::unordered_set<X, std::size_t(*)(const X&)> Xunset;
typedef std::unordered_set<X, std::function<std::size_t(const X&)> > Xunset2;
int main()
{
auto hashX = [](const X&x) { return x.gethash(); };
Xunset my_set (0, hashX);
Xunset2 my_set2(0, hashX); // if you prefer a more flexible set typedef
}
當(dāng)然
hashX可能也是一個(gè)全局靜態(tài)函數(shù)
在第二種情況下,您可以通過(guò)
老式仿函數(shù)對(duì)象(struct Xhasher { size_t operator(const X&) const; };)
std::hash<X>()
任何滿足簽名的綁定表達(dá)式-

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
涵蓋了1)和3)。
2)即使g ++和VC10聲明std::hash<T>::operator()具有不同的簽名,兩種庫(kù)實(shí)現(xiàn)也符合標(biāo)準(zhǔn)。
該標(biāo)準(zhǔn)未指定的成員std::hash<T>。它只是說(shuō)每個(gè)這樣的專業(yè)化必須滿足的第二個(gè)模板參數(shù)等的相同“散列”要求std::unordered_set。即:
哈希類型H是一個(gè)函數(shù)對(duì)象,至少具有一個(gè)參數(shù)類型Key。
H 是可復(fù)制構(gòu)造的。
H 是可破壞的。
如果h是類型H或的表達(dá)式const H,并且k是可以轉(zhuǎn)換為(可能const)的類型的表達(dá)式Key,則h(k)是類型為的有效表達(dá)式size_t。
如果h是類型H或的表達(dá)式const H,并且u是類型的左值Key,則h(u)是一個(gè)有效的表達(dá)式,其類型size_t不會(huì)修改u。
- 3 回答
- 0 關(guān)注
- 838 瀏覽
添加回答
舉報(bào)