2009-11-06 95 views
0

我爲gamemaker創建了一個dll。 dll的數組在那裏真的很慢,所以在詢問了一下後,我學會了我可以在C++中使用地圖並製作一個dll。C++地圖真的很慢嗎?

無論如何,生病代表我需要存儲在一個3d數組: 信息[編號] [編號] [編號] 該id對應於一個對象ID。第一個數字字段的範圍是0 - 3,每個數字代表不同的設置。所述第二數目字段表示在編號字段1. 所以..

information[101][1][4]; 
information[101][2][4]; 
information[101][3][4]; 

這將轉化爲「ID爲101的對象具有用於設置1,2和3的4值」的設置值。 我這樣做是爲了嘗試和與地圖複製:

//declared as a class member 
map<double, map<int, double>*> objIdMap; 

///// lower down the page, in some function 
map<int, double> objSettingsMap; 
objSettingsMap[1] = 4; 
objSettingsMap[2] = 4; 
objSettingsMap[3] = 4; 
map<int, double>* temp = &objSettingsMap; 
objIdMap[id] = temp; 

所以第一張地圖,objIdMap存儲ID爲關鍵,一個指向另一個地圖存儲代表設置爲重點的數量,設置的值作爲值。然而,這是針對遊戲的,因此可能需要存儲具有其自己的ID和設置的新對象(有時每隔幾秒鐘就會有一百個左右的新對象),並且現有的對象不斷需要檢索遊戲的每一步。地圖無法處理?我有一個非常類似的事情與遊戲製造商的陣列和它工作得很好。

+0

你不明白維度和價值之間的區別。 「ID爲101的對象的值爲4,設置爲1」轉換爲信息[101] [1] = 4;' – MSalters 2009-11-06 12:12:26

+1

你幾乎肯定不想使用double作爲你的map的鍵 - 浮點錯誤會對檢索項目所需的比較造成嚴重破壞。 – 2009-11-06 12:15:52

+0

它可能。浮點比較是確定性的。 'objIdMap [1.0]'與objIdMap [1.0]','objIdMap [0.5 + 0.5]'完全相同,但可能不是'objIdMap [(1.0/3.0)* 3.0]'。 – MSalters 2009-11-06 12:25:48

回答

1

1)你的代碼是越野車:你存儲一個指向本地對象的指針objSettingsMap一旦它超出範圍就會被銷燬。您必須存儲地圖obj,而不是指向它的指針,因此本地地圖將被複制到此對象中。

2)地圖可以變得任意大(我有地圖有數以百萬計的entrys)。如果您需要速度,請嘗試hash_maps(C++ 0x的一部分,但也可從其他來源獲得),速度相當快。但是,每秒添加幾百個條目應該不成問題。但是,如果擔心執行速度,你應該總是使用一個分析器。

3)我不太確定你的嵌套結構是否必須是地圖。根據您擁有的設置數量以及它們可能具有的值,結構或位域或矢量可能更準確。

+0

現在我有「map *> objIdMap;」。我應該把什麼,而不是地圖 *值域?它似乎不喜歡「地圖<雙,地圖>」 – Prodigga 2009-11-06 11:56:11

+0

地圖類型應該是地圖<雙,地圖> objIdMap; 確保兩個「>」之間保留一個空格。否則它變成移位運算符「>>」。 – 2009-11-06 12:05:23

+0

喜歡它。現在奇妙地工作。呃,我很害怕...:D謝謝 – Prodigga 2009-11-06 12:07:27

2

不要使用double作爲地圖的關鍵。 如果您想比較兩個雙打,請嘗試使用floating point comparison function

+1

爲什麼不呢?有些解釋,也許有一些參考文獻會有所幫助。 – 2009-11-06 11:55:41

+0

這沒有幫助 – Prodigga 2009-11-06 12:08:42

+0

在許多情況下,如果獲取它們的操作不同,或者即使操作是分段操作,但由於四捨五入錯誤,對於處理器而言顯然相同(對於程序員)的兩個雙打對於處理器來說是不同的相同的FPU可能有更多的位(目前的英特爾編譯器有80位寄存器用於64位雙精度)比雙精度,然後將轉儲到內存的值與寄存器中的值進行比較將產生錯誤。 – 2009-11-06 12:14:45

0

如果您需要真正快速的關聯容器,請嘗試瞭解哈希。地圖「足夠快」,但在某些情況下不夠出色。

嘗試分析需要存儲的對象的結構。如果這些字段是固定的,我建議不要使用嵌套地圖。完全一樣。地圖通常用於「平均」數量的索引。對於數量較少的簡單列表更爲有效,因爲插入/擦除操作的複雜性較低。對於很多索引,你真的需要考慮哈希。

不要忘記記憶。 std :: map是高度動態的模板,因此小型對象會因爲動態分配而存儲大量內存。這是你真正期望的嗎?一旦我參與std :: map的使用刪除,這會降低大約2倍的內存需求。

如果你只需要在啓動時填入地圖並且只搜索元素(不需要改變結構)我會推薦簡單的std :: vector,在插入所有元素後應用排序。然後你可以使用二進制搜索(如你已經排序的矢量)。爲什麼?std :: vector是更可預測的事情。最大的優勢是連續存儲區域。

+0

是的,我需要不斷添加數據。數據是在運行時間內添加的。我現在所有的工作,如果我每步添加1位數據(遊戲中的每幀)它工作正常。但是一旦我一次做2次,我就會看到性能下降。我看着這個哈希的東西,但無法找到它很多。只是一件商品,商店的數量可能永遠不會超過2000個左右。所以我想這是相當小的縮放.. – Prodigga 2009-11-06 13:45:21