给出vector
中的unordered_map<u_int,int>
,
我想检查vector
是否包含任何重复的值。如果两个unordered_maps的所有键及其对应的值都相等,则将其视为重复。
我知道unordered_maps
存在比较运算符,但是我想避免每个元素之间的成对比较。一种经典的解决方案是将vector
的值插入到set
中,然后比较set
和vector
中元素的数量。
但是,这里的问题是要插入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 } }
如果问题不清楚,请随时提出/推荐/编辑。 任何帮助,将不胜感激。预先谢谢你!
答案 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)(主要取决于您提供的哈希函数的质量)的时间复杂度,而且通常都可以使用。