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

时间:2016-12-08 07:34:05

标签: c++ dictionary std stdmap c++-standard-library

为了将一组整数变量映射到值(说我有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. struct或class as key
  4. 等......
  5. 我对这些方法的表现非常好奇。在我的情况下,

    1. 少插入,更多查询
    2. 宽范围但整数键的稀疏分布
    3. 时间更关心我,记忆少
    4. 地图访问是最耗费的部分,因此即使10%的加速也很重要
    5. 问题是哪种方式在我的情况下表现更好?
      如果选择了struct或class key,是否有任何技巧可以使比较器更有效?
      unordered_map更适合这种情况吗?我该如何计算密钥的哈希值?

      对于解决方案的任何建议或评论,我将非常感激。关于更一般情况的讨论也受到欢迎。提前谢谢。

2 个答案:

答案 0 :(得分:4)

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

当然可以:

  • 将整数用作整数将比将它们转换为字符串更快。
  • 结构(或类)应该比元组更快(我的经验)。
  • 同时尝试std::array<>容器(已提供运算符进行比较)。
  • 哈希地图(std::unordered_map<>)比有序地图(std::map<>)快,但当然只有在您不需要使用部分密钥搜索时才能使用。

答案 1 :(得分:0)

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