Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 存储和检索此..的最佳方法是什么。。?_C++_Arrays_Maps_Storage_Vector - Fatal编程技术网

C++ 存储和检索此..的最佳方法是什么。。?

C++ 存储和检索此..的最佳方法是什么。。?,c++,arrays,maps,storage,vector,C++,Arrays,Maps,Storage,Vector,我试了一整晚,关于地图、数组、向量和散列图的话题充斥着我的脑海。我现在很困惑。我在这里发布了以前的问题: 问题已经解决,但地图的速度似乎还不够快。我需要不断添加数据。数据在运行时被大量添加。我现在已经把所有的东西都做好了,如果我在每一步(游戏中的每一帧)添加一个数据,效果就很好了。但一旦我一次做两个,我就会看到性能下降。我查了一下这些杂碎,但没找到太多。仅供参考,商店的物品数量可能永远不会超过2000件左右。所以我想它的规模相当小 正如其他人所说,我想储存的是: “id为101的对象的值为4,用

我试了一整晚,关于地图、数组、向量和散列图的话题充斥着我的脑海。我现在很困惑。我在这里发布了以前的问题:

问题已经解决,但地图的速度似乎还不够快。我需要不断添加数据。数据在运行时被大量添加。我现在已经把所有的东西都做好了,如果我在每一步(游戏中的每一帧)添加一个数据,效果就很好了。但一旦我一次做两个,我就会看到性能下降。我查了一下这些杂碎,但没找到太多。仅供参考,商店的物品数量可能永远不会超过2000件左右。所以我想它的规模相当小

正如其他人所说,我想储存的是: “id为101的对象的值为4,用于设置1”或信息[101][1]=4;
除了我只是不断地用不同的设置(第二个键)将越来越多的对象(differet id,这是键值)添加到系统中我不知道数组的大小(这就是为什么我没有使用数组)。查看了向量,但这让我非常困惑。>_ 这可能很慢,因为每次执行以下操作时都要复制整个贴图对象:

objIdMap[id] = objSettingsMap;
最好先在较大的映射中插入一个空映射,然后再插入实际数据

map<int, double> objSettingsMap; 
objIdMap[id] = objSettingsMap; // insert the empty map so copying is fast

// Use a reference to the map so you don't have to keep looking it 
// up in the parent map
//
map<int, double>& mapref = objIdMap[id];
mapref[0] = value;
mapref[1] = value;
...etc..
map对象设置映射;
objIdMap[id]=objSettingsMap;//插入空映射,以便快速复制
//使用对地图的引用,这样您就不必一直查看地图
//在父地图上
//
map&mapref=objIdMap[id];
mapref[0]=值;
mapref[1]=值;
等
编辑:你还说:

但在比赛的每一步,每一天 objIdMap中id为的对象为 访问它以检索他们的 objSettingsMap

当一个对象访问其objSettingsMap时,您确定它没有复制该映射吗?
还有,当你说数字从100000开始,你的意思是从100000开始计算吗?i、 e.key1=100000,key2=100001,key3=100002,等等。因为如果是这样,你可以简单地使用一个
向量,然后从每个键中减去100000。

看起来你真的不需要像那样嵌套贴图。我建议定义一个“settings”结构来保存需要存储的设置数据

struct Settings
{
    double setting1;
    double setting2;
    double settingN;
};

map<double,  Settings > objIdMap;
struct设置
{
双重设置1;
双重设置2;
双重设置;
};
地图对象地图;
这样,您就不必每次都添加整个地图。这应该有助于提高绩效。 地图非常适合访问数据,但如果您经常使用地图,则应使用数组或向量。如果你知道如何使用地图,向量应该很容易识别

vector<Settings> objects;

objects.push_back(Settings() );

objects[0].setting1 = 1234;
矢量对象;
对象。向后推(设置());
对象[0]。设置1=1234;
这当然可能不是向量的实际应用,但它向您展示了如何添加对象并访问它们。对于向量,当添加一个导致内存重新分配的对象时,会受到影响,但访问是即时的(除了需要缓存的内存之外)


如果对象被删除和添加了很多,我建议标记索引以便回收。您可以通过简单地保留另一个向量来实现这一点,该向量保存不再活动的对象的索引。添加时,请检查该列表以查看是否有要回收的索引。如果列表为空,请推回另一个。通过这种方式,您可以最大限度地减少对象的删除和添加,这是最昂贵的操作。

为什么这不只是
map

有带ID的对象吗?你是在说objIdMap[someobj->getID()]吗?不是,我正在把ID的值从gamemaker传递给函数。(这是gamemaker的DLL)。请澄清地图上需要什么样的访问-也许有更好的方法来组织您的数据。您提到您预计地图中会有大约2000个项目,但随着新项目的创建和旧项目(可能)的退役,特定项目集正在发生变化。您确定旧项目不再活动后将从地图中删除吗?如果您不删除它们,那么您的地图将不受限制地增长,即使在任何给定时间只有2000个项目处于活动状态;最终,地图将容纳如此多的项目,您的性能将受到影响。我建议您开始监控地图的大小,以验证它是否在预期范围内。为什么ID会加倍?不,它仍在挣扎(尽管它稍微好一点)。大键值是否与此有关?对象的id值从100000开始向上。我可以减去传递给函数的所有id的100000。我想我不认为这有多大区别。回复你的编辑:如果我想获得id为“id”的东西的第一个设置,我会这样做:return(objIdMap[id][1]);是的,身份证就是这样工作的。但是物体很快就被创造和毁灭了;可以在10秒钟左右达到1000。对象被销毁,但系统不会返回并重新分配它们使用的id(因此“id”随着对象的创建而不断增加),我认为您可以通过编写
map&mapref=(objIdMap[id]=objSettingsMap)在上面的代码中保存查找--括号可选。不,他正在查找id。列表会慢一些。没错,
列表
不是一个好建议。但是使用带有预定义字段的特殊结构,而不是地图存储设置的想法似乎会更快。是的,我也同意不在这个应用程序中使用列表,我误解了他在做什么。查尔斯:我同意。我希望我在回答之前就想到了。嘿,伙计们,有了resolveaswontfix发布的第一个代码,我如何从地图上访问,比如说,设置1?我认为“objIdMap[id].setting1”可以工作,但它不是..+1,只要第二个键似乎是连续的int标识符,这将是一种更好的方法@Prodigga:仅在关键点分散时使用贴图,并重新考虑第一个关键点的类型。
vector<Settings> objects;

objects.push_back(Settings() );

objects[0].setting1 = 1234;