【问题标题】:equality comparison of two std::unordered_map fails两个 std::unordered_map 的相等比较失败
【发布时间】:2021-12-02 15:09:08
【问题描述】:

如何使用std::equal 检查两个std::unordered_map 是否相等,以检查两个容器是否具有相同的键及其对应的键值。在我的代码下方打印unequal,即使两个容器的大小相同,键集和对应的键值也相同。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<char, int> um1, um2;
    um1['f'] = 1;
    um1['o'] = 1;
    um1['r'] = 1;

    um2['o'] = 1;
    um2['r'] = 1;
    um2['f'] = 1;

    if (um1.size() == um2.size() && std::equal(um1.begin(), um1.end(), um2.begin()))
        std::cout << "equal" << std::endl;
    else
        std::cout << "unequal" << std::endl;
}

【问题讨论】:

  • If (um1 == um2)?
  • 请记住,这是一个 无序 映射,因此迭代器迭代键的顺序是未指定的,并且可能看起来是随机的。这适用于std::map,因为它将以一致的方式对其元素进行排序。但是std::unordered_map 是作为哈希图实现的,因此您获取元素的顺序取决于哈希函数、桶大小和插入顺序。 (如果发生重新散列,它也可能会改变)
  • @NathanOliver 它给了我所需的输出。这适用于任何广告订单吗?
  • @Harry operator== 适用于任何广告订单。但是请记住,比较两个 unordered_map 可能比比较两个法线贴图要昂贵得多(由于它们的未排序性质) - 比较 std::maps 最多为 O(n) 而比较 std::unsorted_maps 最多为 @ 987654333@。 (其中 n 是地图中元素的数量)

标签: c++


【解决方案1】:

https://en.cppreference.com/w/cpp/algorithm/equal

如果两个范围具有相同数量的元素,则认为它们相等,并且对于范围 [first1,last1) 中的每个迭代器 i,*i 等于 *(first2 + (i - first1))。

考虑将此代码添加到您的代码 sn-p:

for (auto it : um1)
    std::cout << it.first << ": " << it.second << std::endl;
std::cout << std::endl;
for (auto it : um2)
    std::cout << it.first << ": " << it.second << std::endl;

f: 1
o: 1
r: 1

o: 1
r: 1
f: 1

请注意,正如您所期望的那样,迭代以不同的顺序发生。因此它们不是 std::equal 因为(如上文所述)期望以相同顺序的相同值。

但是,如 cmets 中所述,此特定容器有其自己的 operator==,它会按照您最初对该特定容器的预期检查值是否相等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 2013-08-14
    • 1970-01-01
    • 2012-08-31
    • 2011-07-09
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多