2013-02-11 83 views
0

以下製作地圖的方式有哪些優點和缺點,以表示二維網格。網格應該可以在任何時候填充,而不需要爲整個事物分配內存,這就是爲什麼我不使用二維數組的原因。地圖與std :: pair地圖的優點是什麼?

std::map<int, std::map<int, Tile*>* >* tiles; 

std::map<std::pair<int, int>, Tile*>* tiles; 

或者如果你有另一個更好的主意讓我知道。對不起,如果這是一個被問及很多問題。

回答

2

這顯然是一個不同的數據結構,取決於你如何訪問它。

第一個更像是一個2級樹結構。再次將x座標映射到幾個y座標。這聽起來有點不適合你的問題。

第二個不允許您獲取特定x座標的所有元素(或者您可以調用它)。反正你可能不需要?

如果您需要將(x,y)座標映射到平鋪,則第二種方法可能會正常。

+0

由於'std :: map'中的鍵是有序的,所以您肯定可以遍歷所有具有特定x座標的元素。從第一個鍵開始,至少與make_pair(x,INT_MIN)一樣大,然後繼續後續的鍵,直到到達結尾或找到其x座標不同的一個鍵。無論使用哪種數據結構都無法做到,可以輕鬆地通過具有特定y座標的元素進行迭代。 – rici 2013-02-11 18:18:20

+0

那麼這兩種方式都沒有明顯的內存或速度問題?目前我可以通過x座標指向的地圖訪問它,然後獲取y座標指示我從該地圖指向的地圖塊。我一直在想它,因爲主要的地圖是一列地圖,以及瓷磚的列和地圖。 – rekh127 2013-02-11 19:21:42

0

爲什麼不使用向量的矢量,std :: vector < std :: vector>?

這樣會更好,除非你的網格很稀疏(並非網格中的每個元素都有一個平鋪),並且你想節省內存。如果速度是問題,使用矢量的訪問時間會更好,因爲std :: map使用tress作爲基礎結構。

+0

*「使用向量的訪問時間會更好」* - 除非有很多元素必須定期遍歷,並且您正在使用矢量向量,這會消除數據局部性。 – 2013-02-11 18:06:38

+0

你是對的,它取決於數據的訪問模式和大小。 – umps 2013-02-11 18:18:37

+0

對不起,我不知道如何描述它,但我的網格很稀疏,它的目的是讓它上面可能會有空白區域產生的斑點,而且這些空白區域只在必要時填充。因此,在成千上萬個可能的瓷磚網格中,最初只有幾十個可能存在,但我需要維持位置的x,y。 – rekh127 2013-02-11 19:25:39