2013-05-29 13 views
0

我正在實施六度Kevin Bacon問題併爲actor節點寫入一個類。 我可以使用set而不是hash_set容器來容納用戶定義的類。爲什麼?錯誤消息顯示:錯誤C2440:'type cast':無法從'const ActorGraphNode'轉換爲'size_t' 1>沒有可執行此轉換的用戶定義轉換運算符,或者運算符不能被調用... 。不能在hash_set中包含用戶定義的類

#include <hash_set> 
#include <set> 
class ActorGraphNode{ 
    public: 
    string ActorName; 
    //hash_set<ActorGraphNode> linkedActors; 
    set<ActorGraphNode> linkedActors; 
    ActorGraphNode(string name):ActorName(name){} 
    void linkCostar(ActorGraphNode actor){ 
     linkedActors.insert(actor); 
     actor.linkedActors.insert(*this); 
    } 
    bool operator<(const ActorGraphNode& a) const 
    { return ActorName < a.ActorName ? true : false;} 
}; 

回答

1

不出所料,hash_set需要您實現您的類型的哈希函數。

class ActorGraphNode{ 
    public: 
    string ActorName; 
    hash_set<ActorGraphNode> linkedActors; 
    //set<ActorGraphNode> linkedActors; 
    ActorGraphNode(string name):ActorName(name){} 
    void linkCostar(ActorGraphNode actor){ 
     linkedActors.insert(actor); 
     actor.linkedActors.insert(*this); 
    } 
    bool operator<(const ActorGraphNode& a) const 
    { return ActorName < a.ActorName;} 
    bool operator ==(const ActorGraphNode& a) const 
    { return ActorName == a.ActorName;} 
    operator size_t() const 
    { 
     return hash<string>()(ActorName); 
    } 
}; 
+0

您還需要相等性,而對於無序/散列容器,'operator <'是不必要的。 –

+0

Equality可以是編譯器生成的,但是可以肯定的是,如果你不想比較整個linkedActors集的開銷,你可以編寫自己的。 – riv

+0

我認爲它更好地使你自己的std :: hash 專業化,而不是使運算符size_t –

0

感謝所有你的答案和評論。這是我的更新代碼與您的幫助。加上函數linkCostar()我現在通過引用傳遞:

class ActorGraphNode{ 
public: 
    string ActorName; 
    hash_set<ActorGraphNode> linkedActors; 
    ActorGraphNode(string name):ActorName(name){} 
    void linkCostar(ActorGraphNode& actor){ 
     linkedActors.insert(actor); 
     actor.linkedActors.insert(*this); 
    } 
    bool operator==(const ActorGraphNode& a) const 
    { return ActorName == a.ActorName ? true : false;} 
    operator size_t() const 
    { 
     const int HASHSIZE = 501; 
     int seed = 131; 
     size_t sum = 0; 
     for(size_t i = 0; i < ActorName.length(); ++i) 
      sum = (sum * seed) + ActorName[i];  
     return sum % HASHSIZE; 
    } 
}; 
+0

STL有一個字符串散列函數,所以你不必自己寫;如果你這樣做,不要返回結果模「HASHSIZE」,你基本上通過強制你的值到0..500範圍來增加碰撞次數。 – riv

+0

thx riv,這裏是我對運營商size_t的更新:\t operator size_t()const { hash H; return H(ActorName); } – user389955