C++将一组整数变量映射到值的有效方法

C++ efficient way to map a group of integer variables to values

本文关键字:映射 方法 有效 变量 整数 一组 C++      更新时间:2023-10-16

为了将一组整数变量映射到值(假设我a1, a2, a3, a4, a5, a6来确定一个值v;这是一个类似于map<tuple<int, int, int, int, int, int>,VALUE_TYPE>map<struct{int, int, int, int, int, int},VALUE_TYPE>的映射),我们可以使用

  1. 由整数作为键构造的字符串
  2. 元组作为键
  3. 结构或类作为键
  4. 等等...

我对这些方法的性能非常好奇。在我的情况下,

  1. 更少的插入,更多的查询
  2. 整数键分布范围广,但分布稀疏
  3. 时间更关心我,记忆更少
  4. 地图访问是最耗费的部分,因此即使是 10% 的加速也很重要

问题是哪种方式在我的情况下表现更好?
如果选择了结构键或类键,有什么技巧可以使比较器更有效率吗?
unordered_map更适合这种情况吗?我应该如何计算密钥的哈希?

我将非常感谢对解决方案的任何建议或评论。也欢迎就更普遍的情况进行讨论。提前谢谢。

基本上:实现不同的解决方案,编写性能测试程序并测量!

确实:

  • 使用整数作为整数将比将它们转换为字符串更快。
  • 结构(或类)应该比元组快(我的经验)。
  • 还可以尝试std::array<>容器(也已经提供了运算符进行比较)。
  • 哈希映射(std::unordered_map<>)比排序映射(std::map<>)更快,但当然只有在不需要使用部分键搜索的情况下才能使用。

此外,如果您的数字相对较小并且一个键中有很多数字,请考虑实现 trie 数据结构。就像std::unordered_map一样,这将允许您在l是键的长度O(l)时间内访问元素,但它也允许您按升序迭代抛出所有值并通过部分键查找值。这里的问题是您的内存消耗将与字母大小成正比(当然,您可以将内边缘存储在一些复杂的数据结构中,但这会对性能产生负面影响)。