2016-11-18 143 views
0

可以說我有一個結構爲value如何將指針映射到unordered_map中的對象?

struct Friend { Person * a, Person* b} 

然後,我有另一個類爲key

class Relation; 

現在我想創建一個鍵值關係

std::unordere_map<Relation*, Friend> my_map; 

我曾嘗試

Relation* r; 
Person * p1; 
Person * p2; 
my_map[r] = {p1, p2}; // works 

my_map[r] = new Friend(p1,p2); // does not work 
// error says : error: no match for 'operator=' 

// my_map[r] = Friend(p1, p2); /// also does not work 
// After Edit from Zan 
// error: no matching function for call to 'Friend::Friend()' 


struct Friend { 
    Friend(Person* x, Person* y){ 
    a = x; 
    b = y; 
    } 

    Person * a; 
    Person* b; 
} 
+2

映射中的值類型是「Friend」,而不是「朋友*'(即:不是指針)。因此'my_map [r] =新朋友(p1,p2);''不會工作,因爲你試圖存儲一個指針作爲值 –

+2

如果你真的想存儲一個指針作爲你的值類型,你必須改變你的地圖定義,'std :: unordered_map my_map;' –

+0

@SteveLorimer是的,它做到了..我想我問了一個問題之前思考:/ – solti

回答

2

Friend != Friend*。如果您聲明一個std::unordered_map,其中Friend作爲值,則不能使用Friend*,反之亦然。

但我沒有得到你想要做的。這聽起來像是一個XY問題。 Relation課程的目的是什麼?這只是爲了表達Person*ab之間的關係?如果是這種情況,那麼數據結構就不適合你的目的。

通過使用std::unordered_map<Relation*, Friend>您使用指針作爲密鑰,但是誰管理的內存爲Relation?誰擁有它?

也許你只需要一個std::unordered_map<Person*, Person*>來存儲一個相互關係,或者std::set<Friend>如果你想交易表現以避免存儲傳遞條目。

+0

我不得不尋找什麼XY的問題是...是的知道它是什麼..這個問題落在以XY問題後。我正在努力簡化複雜的問題,但我認爲它結束了傷害的問題(將嘗試下次小心是),並肯定你的解決方案可 – solti

0

嘗試刪除新的。您正嘗試在地圖中存儲朋友*,而不是朋友。如果您跳過新建,則應該創建一個堆棧,然後將其移入地圖。

2

沒有人真正解決了您的錯誤。我這裏假設你的註釋錯誤:

// my_map[r] = Friend(p1, p2); /// also does not work
// error: no matching function for call to 'A::A()'

是從以前的代碼和A::A()實際上是Friend::Friend()。這個錯誤是關於my_map[r]必須首先創建一個默認的Friend價值之前,它可以做任何事情。函數必須有一些它可以返回的引用。

如果您定義的默認構造函數將Person*值設置爲NULL或nullptr或0,那麼您的代碼將開始工作,除了已指出的其他問題。

不要擔心這裏的表現。在優化中,編譯器將看到值被寫入0,然後寫入實際值而不會被讀取,並且會將第一次寫入刪除爲0.

+0

謝謝你的答案... ...將默認構造函數'後A(){} ;'在struct中,'my_map [r] = Friend(p1,p2);' '現在的工作 – solti

+0

我的另一個問題是,當你說'my_map [R]必須先創建一個默認值,好友纔可以做任何事情else' ..有什麼特別的原因,爲什麼它需要做的。 – solti

+0

@solti:「運算符[]函數必須具有可返回引用的內容。」 –