STL映射与静态数组
STL Map versus Static Array
我必须在查找表中存储有关内容的信息,以便能够非常快速地访问它。我可能需要递归地引用查找表中的一些元素来获得有关内容的完整信息。什么是更好的数据结构:
- 使用其中一个参数映射,该参数对查找表中的所有条目都是唯一的,作为键,其余信息作为值
- 为每个唯一条目使用静态数组,并在需要时根据键(与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;
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 静态数组的自由动态数组
- 如何在C++函数中声明静态 2D 数组?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 基于字节数组生成静态范围整数值
- 如何在C++中删除静态数组?
- 为什么 &a 和 c++ 中的静态数组相同?
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 将在堆栈上声明的元素添加到静态数组
- const_cast静态数组以添加恒常性
- C++访问静态 constexpr 数组
- 初始化类中的静态 const 数组 - C++
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 动态分配的数组和静态数组之间的区别
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 如何在静态函数中使用成员函数数组
- 具有大的2d数组:静态int与int