如何在unordered_map向量中检测重复项?

时间:2018-08-22 10:02:57

标签: c++ algorithm c++11 hash hashmap

给出vector中的unordered_map<u_int,int>, 我想检查vector是否包含任何重复的值。如果两个unordered_maps的所有键及其对应的值都相等,则将其视为重复。 我知道unordered_maps存在比较运算符,但是我想避免每个元素之间的成对比较。一种经典的解决方案是将vector的值插入到set中,然后比较setvector中元素的数量。 但是,这里的问题是要插入set的对象必须重载比较运算符。如果使用unordered_set,则必须为复杂对象重载要使用的哈希函数。为了重载,我需要从std::unordered_map派生一个类。然后,我需要重载比较运算符或哈希函数。我可以想到的另一种解决方案是将所有键值对连接为一个字符串,然后按键对字符串进行排序并检测这些字符串上的重复项。我想知道什么是解决此问题的最佳解决方案。
示例数据:

using namespace std;
typedef unordered_map<u_int,int> int_map;
int_map a = { {1,1}, {2,4}, {3,5} };
int_map b = { {1,1}, {2,-1}, {4,-2} };
int_map c = { {1,1}, {3,5} };

vector<unordered_map<u_int,int>> my_vec;

my_vec.push_back(a);
my_vec.push_back(b);
my_vec.push_back(c);

my_vec的内容是:

 { { 1 => 1, 2 => 4, 3 => 5 }, 
 { 1 => 1, 2 => -1, 4 => -2 }, 
 { 1 => 1, 3 => 5 } }

如果问题不清楚,请随时提出/推荐/编辑。 任何帮助,将不胜感激。预先谢谢你!

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

typedef unordered_map<u_int,int> int_map;

struct my_map_comparator
{
    bool operator()(const int_map& a, const int_map& b) 
    { 
      a_hash = compute_hash_for_a(all keys of a)
      b_hash = compute_hash_for_b(all keys of b)

      return a_hash == b_hash; 
    }
};

std::unordered_set<int_map,std::hash<int_map>, my_map_comparator> map_list();

答案 1 :(得分:1)

如果您可以为std :: unordered_map获得良好的哈希函数,则可能应该这样做:

filename:="C:\Users\haghigy\Desktop\New3\Book" & i & ".xlsx"

该算法非常简单:将散列映射到列表索引,只要散列相等就进行成对映射比较。 这样一来,您就避免了复制整个地图,获得了O(N)(主要取决于您提供的哈希函数的质量)的时间复杂度,而且通常都可以使用。