Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现具有多个键的快速映射? 我正在寻找一个C++关联映射容器类型,可以执行多个密钥查找。地图需要有固定的时间查找,但我不在乎它是有序的还是无序的。它只需要快一点_C++_Dictionary_Containers_Stdmap - Fatal编程技术网

如何实现具有多个键的快速映射? 我正在寻找一个C++关联映射容器类型,可以执行多个密钥查找。地图需要有固定的时间查找,但我不在乎它是有序的还是无序的。它只需要快一点

如何实现具有多个键的快速映射? 我正在寻找一个C++关联映射容器类型,可以执行多个密钥查找。地图需要有固定的时间查找,但我不在乎它是有序的还是无序的。它只需要快一点,c++,dictionary,containers,stdmap,C++,Dictionary,Containers,Stdmap,例如,我想在一个映射中存储一组std::vector对象,其中int和void*作为查找键。int和void*必须匹配才能检索我的向量 这样的容器是否已经存在?还是我要自己滚?如果是,我该如何实施?我一直在尝试将一个boost::unordered_map存储在另一个boost::unordered_map中,但这种方法还没有成功。如果没有更简单的方法,也许我会继续使用这种方法。你可以使用 (尽管我认为您实际想要的是使用一个同时包含void*和integer的类型作为映射的键,并且只是比较两者的

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

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

你可以使用


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

常量查找需要一个哈希映射。您可以使用(或tr1)。键将是int和void指针的键。

如果不想使用boost,可以尝试
map
。但是,查找是O(log(map size))。

因为您也可以使用,因为它似乎非常适合您的要求:

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

要将
int
void*
组合成一个键,可以使用

要使无序映射与该对一起工作,必须指定合适的哈希函数。为了使下面的示例保持简短,我在一个函数中使用了
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);
使用Key=std::pair;
自动哈希=[](常量键和k){
返回std::hash()(k.first)*31+std::hash()(k.second);
};
无序映射um(8,散列);