我想知道你是否有人知道我可以执行多个键查找的c ++关联映射容器类型。地图需要有恒定的时间查找,但我不在乎它是有序还是无序。它只需要很快。
例如,我想在地图中存储一堆std :: vector对象,其中包含整数和void *作为查找键。 int和void *都必须匹配我要检索的向量。有这样的事情吗?或者我将不得不自己动手。如果有,有什么建议吗?我一直在尝试将boost :: unordered_map存储在另一个boost :: unordered_map中,但我还没有使用此方法取得任何成功。如果没有更简单的方法,也许我会继续使用这种方法。谢谢!
答案 0 :(得分:4)
常量查找需要哈希映射。您可以使用boost::unordered_map(或tr1)。关键是int的combined hash和void指针。
答案 1 :(得分:2)
如果您不想使用提升,可以尝试map< int, map<void*, vector> >
。但是查找是O(log(地图大小))。
答案 2 :(得分:0)
您可以使用boost::multi_index。
(虽然我认为你真正想要的是使用一个包含void *和整数作为地图关键字的类型,并且只是比较两者的原始数据,以便为它提供比较运算符地图)
答案 3 :(得分:0)
自C++11起,您也可以使用std::unordered_map
,因为它似乎很符合您的要求:
无序映射是一个关联容器,其中包含具有唯一键的键值对。搜索,插入和删除元素的平均恒定时间复杂度。
要将int
和void*
组合成一个键,可以使用std::pair
。
要使无序映射与该对配合使用,必须指定合适的哈希函数。为了使下面的示例简短,我在handcrafted内使用了std::hash<>
函数调用的lambda expression组合。万一此函数导致性能问题,您可能需要创建更复杂的哈希。
您没有指定向量的内容,因此为了简单起见,我选择了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);