Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++_C++11_Stl_Unordered Map - Fatal编程技术网

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中找不到,这个算法应该做什么?就像任何交集都会做的那样:忽略。您是对的,这不是我要找的:)但无论如何,谢谢。谢谢,但这真的不是问题,我的地图是分开的,不能从一开始就这样压缩。