我为游戏制作者创建了一个dll。 dll的数组真的很慢,所以在询问了一下后我才知道我可以在c ++中使用map并制作一个dll。
无论如何,ill表示我需要存储在3d数组中: 信息[ID] [数] [数] id对应于对象id。第一个数字字段的范围为0 - 3,每个数字代表不同的设置。第二个数字字段表示数字字段1中的设置值。 所以..
information[101][1][4];
information[101][2][4];
information[101][3][4];
这将转换为“对于设置1,2和3,具有id 101的对象具有值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 :(得分:2)
不要使用double作为地图的键。 如果你想比较两个双打,请尝试使用floating point comparison function。
答案 1 :(得分:1)
1)你的代码是错误的:你存储一个指向本地对象objSettingsMap
的指针,一旦它超出范围就会被销毁。您必须存储地图obj,而不是指向它的指针,因此本地地图将被复制到此对象中。
2)地图可以变得任意大(我有数百万个托盘的地图)。如果你需要速度,请尝试hash_maps(C ++ 0x的一部分,但也可以从其他来源获得),这要快得多。但每秒添加几百个条目应该不是问题。但是如果担心执行速度,你应该总是使用分析器。
3)我不确定你的嵌套结构是否必须是地图。根据您拥有的设置数量以及它们可能具有的值,结构或位域或矢量可能更准确。
答案 2 :(得分:0)
如果您需要非常快速的关联容器,请尝试了解哈希值。地图“足够快”但在某些情况下并不出色。
尝试分析您需要存储的对象的结构。如果字段是固定的,我建议不要使用嵌套地图。完全没有。地图通常用于“平均”索引数。对于低数量,简单列表更有效,因为插入/擦除操作降低了复杂性。对于大量索引,您确实需要考虑散列。
不要忘记记忆。 std :: map是高度动态的模板,所以在小对象上存储因为动态分配而导致大量内存。这是你真正期待的吗?一旦我参与了std :: map使用删除,大约2次降低了内存需求。
如果您只需要在启动时填充地图并且只搜索元素(不需要更改结构),我建议在插入所有元素后应用简单的std :: vector并进行排序。然后你可以使用二进制搜索(因为你已经排序了矢量)。为什么? std :: vector是更可预测的东西。最大的优势是连续存储区。