【问题标题】:How can I implement a fast map having multiple keys?如何实现具有多个键的快速映射?
【发布时间】:2011-02-11 04:12:05
【问题描述】:

我正在寻找可以执行多个键查找的 C++ 关联映射容器类型。地图需要有恒定的时间查找,但我不在乎它是有序的还是无序的。它只需要快。

例如,我想在映射中存储一组 std::vector 对象,其中 intvoid* 作为查找键。 intvoid* 都必须匹配才能检索到我的向量。

这样的容器是否已经存在?还是我必须自己动手?如果是这样,我该如何实施?我一直在尝试将boost::unordered_map 存储在另一个boost::unordered_map 中,但是这种方法还没有成功。如果没有更简单的方法,也许我会继续使用潘兴这种方法。

【问题讨论】:

    标签: c++ dictionary containers stdmap


    【解决方案1】:

    由于C++11,您也可以使用std::unordered_map,因为它似乎非常符合您的要求:

    无序映射是一个关联容器,其中包含具有唯一键的键值对。元素的搜索、插入和删除具有平均恒定时间复杂度。

    为了将您的intvoid* 组合成一个键,您可以使用std::pair

    要使无序映射与该对一起使用,您必须指定一个合适的散列函数。为了使以下示例保持简短,我在lambda expression 中使用std::hash<> 函数调用的handcrafted 组合。如果此函数导致性能问题,您可能需要创建更复杂的哈希。

    您没有指定向量的内容,所以为了简单起见,我选择了int。但是,您可以使解决方案适应任何矢量内容。总而言之,您的代码如下所示:

    using Key = std::pair<int, void*>;
    auto hash = [](const Key & k) {
        return std::hash<int>()(k.first) * 31 + std::hash<void*>()(k.second);
    };
    std::unordered_map<Key, std::vector<int>, decltype(hash)> um(8, hash);
    

    Code on Ideone

    【讨论】:

      【解决方案2】:

      如果你不想使用boost,可以试试map&lt; int, map&lt;void*, vector&gt; &gt;。然而,查找是 O(log(map size))。

      【讨论】:

        【解决方案3】:

        持续查找需要哈希映射。您可以使用boost::unordered_map(或tr1)。关键是 int 的 combined hash 和 void 指针。

        【讨论】:

          【解决方案4】:

          你可以使用boost::multi_index

          (虽然我认为你真正想要的是使用一个包含 void* 和整数的类型作为映射的键,并且只是比较两者的原始数据,以便为地图)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-06
            • 1970-01-01
            • 2021-02-05
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多