2015-09-11 50 views
4

我的問題是,我應該如何將對象與對方聯繫起來。使用唯一的成員標識符標識對象是個好主意嗎?

我有兩個載體,vector<Baby> babiesvector<Toy> toys。每個嬰兒和每個玩具都有一個獨特的成員int id。因此,所有嬰兒和玩具的編號從0到n。

現在,每個寶貝都有一個喜歡的玩具,每個玩具都有一個喜歡的寶貝。到目前爲止,我使用指針:寶寶有一個指向他喜歡的玩具的指針,這個玩具有一個指向寶寶的指針。 (沒關係,因爲我永遠不會改變向量) 然而,嬰兒和玩具之間的區別是它們的身份,而不是它們在向量中的位置。

當我相處時,我質疑我的設計,發現指針可以工作,但它們可能會導致未來出現問題。相反,如果我使用ID,我會很好,但我需要訪問整個嬰兒或玩具載體。

在這種情況下是否有普遍的做法?使用指針是好主意嗎?我應該用智能的方式編寫我自己的使用ID的容器嗎?

編輯: 我喜歡補充,我已經考慮了一個地圖來關聯嬰兒和玩具。不過,我在運行時確定了寶寶與玩具的關係(以及其他方式)。找到這種關係是該計劃的主要部分。因此我不確定我是否可以使用地圖。但是,我會看看它(直到現在還沒有使用它)。更重要的是,關於首選玩具和寶寶的信息必須是客體的一部分,而不是(僅)高級數據結構的信息。

+0

你有沒有想過使用'std :: map '?你可以將向量中嬰兒的位置用作'key'和相應玩具在其向量中的位置作爲'value',特別是如果你不改變向量。或者,如果您不想要職位,您可以使用這些ID作爲鍵和值 – Varius

+0

如果您還沒有聽說過「字符串型界面」,我鼓勵您查看它。不要爲每個ID使用'int',而應該使'BabyId'和'ToyId'是不同的類型;你不想無意間回收寶寶,是嗎? –

+0

指針可以。儘量不要使用ID - 或者只是作爲一個簡單的屬性,如名稱等等。指針始終是唯一的,ID可能會被錯誤地複製。 – PiotrNycz

回答

2

爲關係使用唯一ID有一些優點。這些ID不能像指針那樣晃動,或者像矢量索引那樣超出界限。他們可以很容易地序列化。當向量重新分配或重新排序時,它們不會失效。

但它們也有一些缺點。您需要確保它們保持唯一(使用GUID可以提供幫助)。他們的工作效率可能非常低。要通過ID查找對象,您必須搜索整個向量。你可以做一個遍歷向量來創建一個查找map/unordered_map/vector其中鍵是ID和值是一個指向矢量中的對象或索引的指針。

+0

在我的情況下,通過ID查找元素是沒有問題的,因爲它們可以在向量中具有相應的位置。 – dani

+0

@dani好吧,我想你說過每個對象都是它的ID而不是它在矢量中的位置。在這種情況下,你很好。唯一的缺點是你的數據結構是相當固定的,你不能輕易刪除對象或重新排序它們。 –

+0

好吧,如果我使用ID,我可以重新排列它們。我不會銷燬或創建新的對象。只需在整個計劃中將它們分配給對方。 – dani

-1

這種結構的矢量怎麼辦?

struct BabyToy { Baby B; Toy T;}; 

class BabyToy 
{ 
    public: 
    Baby B; 
    Toy T; 

    BabyToy(Baby b, Toy t) 
    { 
    B=b; 
    T=t; 
    } 
}; 
+0

這個問題並沒有說明一個玩具是否喜歡喜歡玩具的同一個寶貝,或者確實只有一個寶貝喜歡一個玩具。 –

+0

@ Ben Voigt - 你是對的,我的錯誤是由於我的英語不好導致對這個問題的誤解:我認爲這是Baby和Toy之間的1:1關係......無論如何,我是新的本網站和我對我的回答的表面性和匆忙表示歉意......在未來,我將盡力在理解問題後仔細閱讀給出我答案的問題。 PS:我剛纔添加了這個評論,因爲當我提供了我剛纔記錄的答案時,還不知道所有規則(以及被否決的風險!) –

0

另一種方法是使用一個std::map<Baby, Toy>/std::map<Toy, Baby>甚至std::unordered_map<Baby, Toy>/std::unordered_map<Toy, Baby>

#include <map> 

std::map<Baby, Toy> babyMap; 
std::map<Toy, Baby> toyMap; 

// ... 

babyMap[theBaby] = theToy; 
toyMap[theToy] = theBaby; 

如果Baby 「碰巧」 喜歡一個以上的玩具,或反之亦然,你可以使用std::map<Baby, std::set<Toy>> S/std::map<Toy, std::set<Baby>>

P.D:通常,int -style ID是一種糟糕的代碼味道,並且可能會在以後導致嚴重問題。

-1

抱歉,但你的問題Ĵ閱讀:

現在,每個寶寶都有一個首選玩具,每個玩具都有一個首選 嬰兒。

+0

????? **這個答案是什麼**? – 3442

+0

@ KemyLand - 對不起,這不是一個答案,而是一個添加到我以前的答案的評論(我是這個網站的新手,我有一些英語困難,我通過閱讀支持中心瞭解了規則>剛纔回答) –