第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在無(wú)序容器中將std :: hash <Key> :: operator()專用于用戶定義類型?

如何在無(wú)序容器中將std :: hash <Key> :: operator()專用于用戶定義類型?

C++
慕容3067478 2019-10-09 16:45:01
為了支持用戶定義的鍵類型std::unordered_set<Key>和std::unordered_map<Key, Value> 一個(gè)具有提供operator==(Key, Key)和散列函子:struct X { int id; /* ... */ };bool operator==(X a, X b) { return a.id == b.id; }struct MyHash {  size_t operator()(const X& x) const { return std::hash<int>()(x.id); }};std::unordered_set<X, MyHash> s;僅std::unordered_set<X> 使用type 的默認(rèn)哈希值編寫將更方便X,例如與編譯器和庫(kù)一起提供的類型。經(jīng)過(guò)咨詢C ++標(biāo)準(zhǔn)草案N3242§20.8.12 [unord.hash]和§17.6.3.4[hash.requirements],增強(qiáng)無(wú)序g ++ include\c++\4.7.0\bits\functional_hash.hVC10 include\xfunctional堆棧溢出中的各種相關(guān)問(wèn)題似乎可以專長(zhǎng)std::hash<X>::operator():namespace std { // argh!  template <>  inline size_t   hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++  // or  // hash<X>::operator()(X x) const { return hash<int>()(x.id); }     // works for g++ 4.7, but not for VC10 }                                                                             鑒于編譯器對(duì)C ++ 11的支持尚處于試驗(yàn)階段---我沒(méi)有嘗試過(guò)Clang ---,這是我的問(wèn)題:向名稱空間添加這樣的專業(yè)化合法std嗎?我對(duì)此有百感交集。哪個(gè)std::hash<X>::operator()版本(如果有)符合C ++ 11標(biāo)準(zhǔn)?有便攜式的方法嗎?
查看完整描述

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。)


*)我想,只要其中一種涉及類型是用戶定義的即可。


查看完整回答
反對(duì) 回復(fù) 2019-10-09
?
慕俠2389804

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á)式-


查看完整回答
反對(duì) 回復(fù) 2019-10-09
?
繁星淼淼

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。


查看完整回答
反對(duì) 回復(fù) 2019-10-09
  • 3 回答
  • 0 關(guān)注
  • 838 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)