C++ 两个无序映射的交集
基本上,我的问题与相同,但有两个C++ 两个无序映射的交集,c++,c++11,stl,unordered-map,C++,C++11,Stl,Unordered Map,基本上,我的问题与相同,但有两个无序的地图: std::unordered_map<Key, Value> A; std::unordered_map<Key, Value> B; std::无序地图A; std::无序地图B; 我想要一个十字路口,类似于 std::unordered_map<Key, std::pair<Value, Value>> C; std::无序映射C; 其中,键是A和B中的值,值分别是A和B中的一对值 实现这一
无序的地图
:
std::unordered_map<Key, Value> A;
std::unordered_map<Key, Value> B;
std::无序地图A;
std::无序地图B;
我想要一个十字路口,类似于
std::unordered_map<Key, std::pair<Value, Value>> C;
std::无序映射C;
其中,键是A和B中的值,值分别是A和B中的一对值
实现这一目标的最快方法是什么?目前,我迭代了这两个函数中最小的一个,并在第二个函数中查询密钥。幸运的是,我的密钥类型通常非常容易散列,但我没有找到一种方法来获取迭代映射的密钥的散列值,从而节省第二次散列计算的时间(需要明确的是:我不知道如何在不重新计算的情况下恢复哈希,以及在哪里找到类似于find
,并将计算出的哈希作为参数[1])
谢谢
[1]是的,我知道,早期优化是很多疾病的根源。但我想知道这是否可能,而不是解释这将如何成为一个漏洞。事实上,在某些情况下,根据用户输入,密钥可能会很复杂,而且散列的成本也很高。我知道你不想听,但我还是要说:你应该ld缓存实例上的哈希值,以便哈希简化为简单的成员查找。如果实例是不可变的(或至少进入哈希函数的部分是不可变的),那么最简单的方法就是在构造函数中计算散列。如果密钥对散列来说确实非常昂贵,那么可以避免散列,代价是从一开始就使用类型为
std::unordered_map
的A和B。(使用pair.second到默认构造值)
假设交集计算完成后,不需要原始A和B,只需迭代2个交集中最小的一个(假设B是最小的):
-->在C中移动B
for (auto it = C.begin(); it != C.end();it++ ) {
auto res = A.find(it->first);
if(res == A.end() )
{
//Can't call C.erase(it) here as it would cause problem in the loop
v.push_back(it);
}
else
{
// Assign the second value of the pair to the value obtained in A.
it->second.second = res->second.first;
}
}
for( auto it : v)
C.erase(it);
这将使您的C中充满对,其中pair.first是B中的值,pair.second是A中的值
如果您需要保持A和B不变,而不是在C中移动B,只需在C中复制B。如果您已排序
map
s,则更简单,可能更快。您可以在类中缓存哈希值吗?在哈希函数中,您可以检查哈希是否已计算并返回它。记住重新计算存储的哈希值(如果有)“是的,我考虑过,但我想避免这种情况。我建议您使用示例输入和输出来澄清,如果在A中找到某个键,但在B中找不到,这个算法应该做什么?就像任何交集都会做的那样:忽略。您是对的,这不是我要找的:)但无论如何,谢谢。谢谢,但这真的不是问题,我的地图是分开的,不能从一开始就这样压缩。