STL映射与静态数组

STL Map versus Static Array

本文关键字:数组 静态 映射 STL      更新时间:2023-10-16

我必须在查找表中存储有关内容的信息,以便能够非常快速地访问它。我可能需要递归地引用查找表中的一些元素来获得有关内容的完整信息。什么是更好的数据结构:

  1. 使用其中一个参数映射,该参数对查找表中的所有条目都是唯一的,作为键,其余信息作为值
  2. 为每个唯一条目使用静态数组,并在需要时根据键(与MAP中使用的键相同)访问它们。

我希望我的软件是健壮的,如果我们有任何崩溃,这将是灾难性的我的产品。

这取决于您拥有的键的范围。

通常,当你说到查找表时,你指的是一个可以直接索引的小表(O(1))。举个简单的例子,对于替换密码,您可以使用char cipher[256]并简单地使用字符的ASCII码进行索引,以获得替换字符。如果键是复杂的对象或者实在太多了,你可能就只能使用map了。

您也可以考虑使用散列表(参见unordered_map)。

回答:

如果键本身可以是任何32位的数字,那么存储一个非常稀疏的40亿个元素的数组就没有意义了。

如果你的密钥本身在0…10000,那么您就可以拥有一个包含10000个元素的数组,其中包含指向对象(或对象本身)的指针,只有2000-5000个元素包含非空指针(或分别包含有意义的数据)。访问将是0(1)。

如果你可以有大的钥匙,那么我可能会用unordered_map。对于5000个元素的map,你会得到O(log n)意味着大约12次访问,一个哈希表应该差不多是一次或两次访问。

我不熟悉完美哈希,所以我不能建议他们的实现。如果你选择这样做,我将非常感谢你提供一两个链接,让你记住这些想法。

std::map中的查找时间应该是O=ln(n),在最坏的情况下O=n在静态数组中进行线性搜索。

我强烈选择std::map,即使它有更大的内存占用(在大多数情况下,这应该无关紧要)。

你也可以制作"地图的地图"或者更深层的结构:

typedef std::map<MyKeyType, std::map<MyKeyType, MyValueType> > MyDoubleMapType;