【问题标题】:Alternative to nested maps in standard namespace替代标准命名空间中的嵌套映射
【发布时间】:2016-09-25 06:54:04
【问题描述】:

我有嵌套类型的地图:

std::map<int,std::map<pointer,pointer>>

我每次/每帧都在迭代地图并对其进行更新。所以基本上我有 2 个嵌套的 if 循环。 我有一个数组,我需要使用 2 个属性对数据进行排序。第一个属性是整数,它是第一个键,然后第二个属性是一个指针,它是主映射内嵌套映射的键。所以我的代码是这样的:

iterator = outermap.find();
if(iterator!=outermap.end()){
    value = iterator->second;
    it1 = value.find();
    if(it1!=value.end(){
        value1 = it1->second;
        // do something
    }
    else{
        // do something and add new value
    }
}
else {
   // do something and add the values
}

这真的很慢,导致我的应用程序丢帧。有没有其他选择?我们可以使用哈希码和链表来实现吗?

【问题讨论】:

  • 你能再解释一下你的场景吗?遍历地图不需要ifs。有多少元素?您需要订购它们吗? minimal reproducible example?
  • @Mat 如果您需要更多信息,请告诉我。

标签: c++ hash stl linked-list


【解决方案1】:

首先,你的问题有点模糊,所以这可能适合也可能不适合你的问题。

现在,您有一个map&lt;int, map&lt;pointer, pointer&gt;&gt;,但您从未对内部地图本身进行操作。您所做的就是通过intpointer 查找值。这也正是您应该做的,而是使用这两者的聚合作为映射中的键。其类型为pair&lt;int, pointer&gt;,然后映射变为map&lt;pair&lt;int, pointer&gt;, pointer&gt;

还有一点:您似乎事先知道要在地图中搜索的键。如果检查元素是否存在不仅仅是为了安全,您还可以使用地图的重载operator[]。然后查找变为outermap[ikey][pkey] 并返回一个默认初始化的pointer(所以可能是一个空指针,它pointer 真的是一个指针)。对于建议的组合地图,查找将是 outermap[make_pair(ikey, pkey)]

【讨论】:

    【解决方案2】:

    您可以使用 std::unordered_map,它会散列键以便更快地完成查找。使用value = iterator-&gt;second 会将您的整个地图复制到“值”变量。使用引用可避免不必要的复制,并提高性能,例如:auto &amp; value = iterator-&gt;second

    std::map 也保证为ordered。这可以为您带来优势,因为您的键是最外层地图的整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多