std :: map与自编的基于std :: vector的字典

时间:2011-07-24 23:50:27

标签: c++ performance data-structures vector stdmap

我正在为我的游戏引擎构建内容存储系统,我正在寻找存储数据的可能替代方案。由于这是一款游戏,因此表现很重要。特别是考虑到引擎中的各种实体将在内容管理器创建时从内容管理器的数据结构请求资源。我希望能够通过名称而不是索引号来搜索资源,因此某种字典是合适的。

使用std :: map并基于std :: vector创建自己的字典类有什么优缺点?是否有任何速度差异(如果是这样,性能会受到什么影响?即附加与访问)并且是否有时间花时间编写我自己的课程?

有关需要发生的事情的背景知识: 只有在引擎加载时,才会一次写入数据结构。所以在游戏过程中实际上没有写作。当引擎退出时,要清理这些数据结构。无论何时创建实体或交换地图,都可以随时读取它们。一次只能创建一个实体,或者多达20个实体,每个实体都需要可变数量的资源。资源大小也可能根据引擎开头读取的文件大小而变化,图像最小,音乐最大,具体取决于格式(.ogg或.midi)。

3 个答案:

答案 0 :(得分:7)

Map:std::map保证了对数查找的复杂性。它通常由专家实施,并且具有高质量(例如异常安全)。您可以使用自定义分配器来满足自定义内存要求。

您的解决方案:它将由您撰写。向量用于按位置随机访问的连续存储,那么如何按值实现查找?你能保证对数复杂度还是更好?你有特定的内存要求吗?您确定可以正确有效地实施查找算法吗?

第3个选项:如果您的密钥类型为string(或者比较费用昂贵的东西),请同时考虑std::unordered_map,其中常量 - 按值查找时间典型情况(但不完全保证)。

答案 1 :(得分:2)

std::map无论如何都是以性能为基础编写的,虽然它确实有一些开销,因为它们试图推广到所有情况,但它最终可能比你自己的实现更有效。它使用红黑二叉树,提供所有操作 O [log n]效率(除了出于显而易见的原因复制和迭代)。

您多久会阅读/写一次地图,每个元素会在多长时间内存在?此外,您还必须考虑需要调整大小的频率等等。每个问题对于为您的实施选择正确的数据结构至关重要。

总的来说,其中一个std函数可能就是你想要的,除非你需要的功能不是单一的,或者你有一个想法可以改善他们的时间复杂性。

编辑:根据您的更新,我同意 Kerrek SB ,如果您使用的是C ++ 0x,那么std::unordered_map将是一个很好的数据结构案件。但是,请记住,如果存在冲突的哈希值,则性能会降低到线性时间复杂度(这不会发生在std::map),因为它会将两个对存储在同一个存储桶中。虽然这种情况很少见,但它的概率随着元素数量的增加而明显增加。因此,如果您正在编写一个巨大的游戏,std::unordered_map可能会变得不如std::map更优化。只是一个考虑。 :)

答案 2 :(得分:2)

如果您想要std::map的速度保证以及std::vector的低内存使用量,您可以将数据放入std::vectorstd::sort然后使用std::lower_bound找到元素。