2011-04-16 53 views
1

我在把一個類的對象在一個無序的地圖如下關鍵 有問題的關鍵是一個簡單的例子:對象無序地圖

class first 
{ 
     string name; 
     public: 
     first(){} 
     first(string nam):name(nam){} 
     string get_name() const 
     { 
       return name; 
     } 
}; 

struct SampleTraits 
{ 
     size_t operator()(const first &that) const 
     { 
       return tr1::hash<const char*>()(that.get_name().c_str()); 
     } 

     bool operator()(const first &t1,const first &t2) const 
     { 
       return t1.get_name()==t2.get_name(); 
     } 

}; 
typedef tr1::unordered_set<unsigned short> uset; 
typedef tr1::unordered_map<first,uset,SampleTraits,SampleTraits> umap; 

ostream& operator <<(ostream& out, uset &ust) 
{ 
     for(uset::iterator it=ust.begin();it!=ust.end();++it) 
       out<<" "<<*it; 
} 

int main() 
{ 
     umap *mymap= new umap; 
     string names,nm,n; 
     cout<<"\nEnter 1st name: "; 
     cin>>names; 
     first obj(names); 
     (*mymap)[obj].insert(100); 
     (*mymap)[obj].insert(120); 
     (*mymap)[obj].insert(112); 

     cout<<"\nEnter 2nd name:"; 
     cin>>nm; 
     first obj2(nm); 
     (*mymap)[obj2].insert(201); 
     (*mymap)[obj2].insert(202); 

     cout<<"\nEnter name which u want to search:"; 
     cin>>n; 

     first obj1(n); 
     umap::iterator it=mymap->find(obj1); 
     cout<<it->first.get_name(); 
     cout<<it->second; 
     //delete mymap; 
     /* 
     for(umap::iterator it=mymap->begin();it!=mymap->end();it++) 
     { 
       cout<<it->first.get_name()<<" "; 
       cout<<it->second<<endl; 
     } 
     */ 
     return 0; 
} 

我的問題是,當IAM試着插入兩個不同對象和試圖顯示它是顯示分段錯誤..再次,如果我嘗試使用find(),那麼它也顯示分段錯誤..它很難理解爲什麼unordered_map顯示此行爲。

任何幫助將不勝感激!這對我的項目將是一個很大的幫助...

回答

0

看起來你忘記從運營商< <返回爲uset。儘管大多數編譯器會爲這些函數發出警告,但仍然需要編譯它們,運行此類程序將導致未定義的行爲。

 

ostream& operator <<(ostream & out, uset & ust) 
{ 
    for(uset::iterator it=ust.begin();it!=ust.end();++it) 
     out<<" "<<*it; 

    return out; 
} 
 
+0

@KO thnks ....只是忘記了... – 2011-04-16 12:02:41

4

問題在於散列函數。它不像你所期望的那樣使用指針類型,因爲它使用指針來計算散列值而不是其內容。使用std :: string可以解決問題。

return tr1::hash<string>()(that.get_name()); 
+0

@Eugene ...謝謝,我會盡力爲你所說的,回來給你... – 2011-04-16 12:03:26

+0

@Eugene ...謝謝很多..它的工作...我只是碰巧複製我用於SGI hash_map的散列函數.... – 2011-04-16 12:12:54

+0

@sharad pradhan我很高興它幫助。你能將我的回答標記爲答案嗎? – Eugene 2011-04-16 20:53:27