Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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++ - Fatal编程技术网

C++ 存储命名数据,其中';名称';大于';数据';?

C++ 存储命名数据,其中';名称';大于';数据';?,c++,C++,我正在编写游戏的逻辑部分,希望创建、检索和存储值(整数),以跟踪进度。例如,一扇门将在std::map中创建一对(“location.room.doorlock”,0),解锁此门将该值设置为1。任何时候玩家想要通过这扇门,它都会通过这个键名来检索值,看看它是否可以通过。(这只是一个示例,但重要的是,此信息存在于“门”对象本身之外,因为字符或其他事件可能检索此数据并对其进行操作。) 但问题是名称(或映射键)本身远远大于它所指的数据,这似乎是浪费,因此感觉“不对” 有没有一种常用的或最好的方法来存储

我正在编写游戏的逻辑部分,希望创建、检索和存储值(整数),以跟踪进度。例如,一扇门将在std::map中创建一对(
“location.room.doorlock”
0
),解锁此门将该值设置为
1
。任何时候玩家想要通过这扇门,它都会通过这个键名来检索值,看看它是否可以通过。(这只是一个示例,但重要的是,此信息存在于“门”对象本身之外,因为字符或其他事件可能检索此数据并对其进行操作。)

但问题是名称(或映射键)本身远远大于它所指的数据,这似乎是浪费,因此感觉“不对”

有没有一种常用的或最好的方法来存储这种类型的数据,一种密钥不会比数据本身大很多的方法


如果重要的话,可以知道在编译时为进度数据本身分配多少空间。它也不需要使用
std::map
,只要我不必使用原始数组索引来获取或存储数据。

如果您真的想减小字符串的大小(尽管字符串长度似乎没有那么糟糕),您似乎有两个选择

您可以更改命名约定,也可以实现哈希。散列可以以散列映射(也称为无序映射)的形式实现,也可以手工实现(您可以创建一个小程序,将名称散列为int,然后将其作为一对使用)。Hashmaps/无序映射可能是您最好的选择,因为有很多支持它的代码,您不必冒着处理自己程序中的bug的风险


这称为过早优化。只要代码可读且易于使用,就不用担心键的大小;你知道一百个字符的内存需要多少钱吗?@Beta-我不担心钥匙本身的成本。但我觉得它的成本很有趣。在我开始编写大量依赖它的代码之前,我想问一下,对于这种类型的数据库,是否有经过验证的方法。如果像这样使用std::map很好,我将继续使用它,在不了解更多游戏的情况下,很难说这种方法是否是最好的。我会将数据结构封装在一个
地下城状态
类中,这样我以后就可以轻松地更改实现,而不会干扰依赖它的代码。@Beta-这是个好主意,实际上,很可能一开始就应该这样做。然后我将总结这个结构,并在以后担心实现,只要它现在可以工作,我将使用组件系统。你有一个通用的游戏对象(你不继承像“门”这样的更具体的类型),你将组件附加到它(每个都有一个插槽)。这些组件类型分别包含图形、物理、要执行/更新的逻辑对象,以及附加到其他通用游戏对象的其他逻辑片段可以看到的数据。逻辑对象查询并触发输入和声音。拥有一个物理组件意味着一个对象在这个世界上,它存储了一个物理对象与这个框架交互的其他物理对象的列表。