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

MGZ*_*ero 1 c++ performance vector stdmap data-structures

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

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

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

Ker*_* SB 7

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

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

第三种选择:如果您键入的类型是string(或比较昂贵的东西),还要考虑在典型情况下std::unordered_map具有恒定时间值查找(但不完全保证).

  • @Kerrek:"在性能关键的情况下使用std :: map键入字符串肯定是疯了"......在这种情况下是的,但不是因为你暗示的原因.你不会在实际环境中快速实施和测试替代方案.字符串的字符串比较通常在前几个字符中变化很便宜,而散列可能很昂贵.字符串的条目数和可变性是关键因素.无论如何,一个'的std :: map`决不会以最快的速度在预先排序'的std :: VECTOR`一个'的std :: binary_search`,这应该被视为替代`unordered_map`. (2认同)