2017-05-21 59 views
-2
#ifndef ACTOR_H 
#define ACTOR_H 

#include<vector> 
#include<iostream> 
#include<queue> 
#include<string> 

struct Link; 
/* (Vertex) Object Class to represent actors */ 
class ActorNode { 
    private: 
     /*Member Variables*/ 
     std::string name; 
     std::vector<Link*> links; 

    public: 
     /*Constructor*/ 
     ActorNode() : name("") {} 

     /*Getters and Setters*/ 
     std::string getName(); 
     void setName(std::string actor); 

     std::vector<Link*> getLinks(); 

     /*Member Functions*/ 
     //void addLink(); 
}; 
struct Link { 

    /*Member Variables*/ 
    ActorNode* cs1; 
    ActorNode* cs2; 
    std::string movieTitle; 
    int year; 
    int weight; 

    /*Constructor*/ 
    Link() : cs1(0), cs2(0), movieTitle(""), year(1), weight(1) {} 

}; 
#endif 

所有的晚上。所以我正在研究一個圖形實現,它是爲了解決兩個參與者之間的最短路徑(包括加權和未加權),這些參與者是由這兩個參與者共同行動的電影鏈接的演員圖。我的意思是解決最短路徑問題使用Dijkstra算法。存儲足夠的信息來建立圖形

我的實現是我想擁有一個ActorNode類,它包含一個字符串,該字符串是該角色的名稱,並且該矢量包含連接兩個參與者的「links/movies」向量。我的鏈接類只有兩個ActorNode指針鏈接兩個聯合星,然後電影的名稱,它製作的一年,它的重量(這將在稍後發揮)

所以這是我的問題: 我建立圖表關閉,僅僅有這對每行一個大的文本文件的... actorName的movieName movieYear

我不相信我保存足夠的信息來有效地發現和創造我的演員之間的聯繫。我正在尋找一種專門解決這個問題的方法。 我正在考慮製作一個hashmap,其中的關鍵將是一個電影名稱,並且該值將是由該電影的強制轉換組成的ActorNode指針的向量。像這樣的東西可以讓我很快建立我的演員之間的聯繫,我相信。 我有點困惑,雖然我可能存儲這個數據結構。我當然不希望每個ActorNode都有一個散列表,用於我圖中所有電影的所有演員陣容。

這是不好的編程,使這樣的全局變量?

+0

每行有什麼?校對你的問題,並閱讀https://stackoverflow.com/editing-help –

+0

啊對不起,我輸入了它,但它一定已經編輯了它或什麼。每一行都是這樣組織的......演員姓名......電影......年份 – KoalaIsDead

+0

請[編輯]你的帖子並修復錯誤。 **閱讀http://stackoverflow.com/editing-help**。 –

回答

0

您可能想要有兩張地圖(散列或任何其他品種),一個將演員姓名映射到某種Actor數據結構,另一個將電影標題映射到某種Movie數據結構。 ActorMove不需要知道地圖的存在。

您可以在計算並返回圖形的函數中將兩個圖映射爲局部變量。一旦函數返回,地圖自動被銷燬。但是,您需要一些數據結構來保存指向圖的所有節點的指針。您可以爲此創建一個單獨的指針向量。然而,地圖本身對此非常有用,並且在圖形準備就緒後可以用於查找演員和電影。

以下是這可能看起來像(未經測試的僞代碼,只有部分的討論必要的):

class Movie; 

class Actor { 
    std::string name; 
    std::vector<Movie*> career; 
}; 

class Movie { 
    std::string title; 
    std::vector<Actor*> cast; 
}; 

class Graph { 
    std::unordered_map<std::string, std::unique_ptr<Actor>> actors; 
    std::unordered_map<std::string, std::unique_ptr<Movie>> movies; 
}; 

原則上,這代表你的圖。兩種節點暗示它是電影和演員的二分圖,而不是你最初想用電影作爲邊緣的圖,但是你可以將Dijkstra或任何其他圖算法應用於很少或不需要修改。

如果你想要的話,你可以用這個二分圖來構建你想要的圖的物理表示。只需爲每部電影中的每對演員添加一個鏈接即可。這可能是多餘的,因爲無論何時你想枚舉鏈接,你都可以直接使用Movie節點。

+0

這很有趣。這與我最初提出的內容相同,有些人告訴我這對我所做的事情來說是過分的,這就是爲什麼我想出了我在這裏發佈的內容。我真的很喜歡我的原創思想,它和你的原創思想是一樣的,除了無序映射將字符串保存爲鍵和Actor指針和電影指針。我不熟悉unique_ptr。我聽到的使用這個想法的問題是它存儲了大量的信息冗餘。問題是我的第二個想法是我顯然沒有存儲足夠的信息。也許生病只是回到我原來的想法。謝謝 – KoalaIsDead

+0

另一個我不能理解的問題是,感覺就像你只能通過actor和vector類遍歷圖,而實際上並不需要圖類。儘管我可能不需要無序地圖來遍歷我的圖,但我現在開始明白了,但我幾乎肯定會需要它們來構建圖表。也許我仍然需要遍歷地圖(我還沒有到那裏,所以不是100%肯定),但如果我不需要它們,也許我可以嘗試在堆棧上製作我的地圖,並在圖形生成後刪除它們。只是想着大聲笑。再次感謝 – KoalaIsDead

+0

在這種情況下,unique_ptr是常規指針的更好選擇。您應該熟悉它,但您也可以使用常規指針。 「儘管我可能不需要用無序地圖來遍歷我的圖,但我現在開始明白,但我幾乎肯定會需要它們至少將圖形化」 - 完全是這樣。您可以將其中一個地圖轉換爲矢量,並擺脫這兩個地圖。矢量將足以遍歷圖形。您可能仍然希望保留地圖用於其他目的,例如如果您構建交互式程序,用戶可以使用名稱/標題進行查詢。 –