6

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

例如,我想在地图中存储一堆std::vector对象,其中 anint和 avoid*作为查找键。int和必须匹配void*我的向量才能被检索。

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

4

4 回答 4

4

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

于 2010-04-22T16:49:10.593 回答
2

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

于 2010-04-22T16:52:16.520 回答
1

C++11开始,您还可以使用std::unordered_map, 因为它似乎非常适合您的要求:

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

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

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

你没有指定你的向量的内容,所以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);

Ideone 上的代码

于 2019-06-05T09:00:18.737 回答
0

您可以使用boost::multi_index

(尽管我认为您真正想要的是使用包含 void* 和整数的类型作为映射的键,并且只是比较两者的原始数据以便为映射提供比较运算符)

于 2010-04-22T16:47:50.297 回答