如何轻松检查std :: map和std :: unordered_map是否包含相同的元素

Ami*_*nos 11 c++ stl

我正在编写Google测试单元测试,我想检查一下的内容unordered_map<std::string, std::string>是否与a相同std::map<std::string, std::string>

我认为std::equal不会起作用,因为元素std::map按照标准排序.订单并不重要.

mic*_*srb 14

我不认为有更好的方法,只是遍历一个地图的所有元素,并检查它们是否存在于另一个地图中.如果您还检查元素的数量是否相同,您将知道地图是否完全相同.

例如:

template<typename K, typename E>
bool maps_equal(const std::map<K, E> &map, const std::unordered_map<K, E> &unordered_map) {
    return
        map.size() == unordered_map.size() &&
        std::all_of(map.cbegin(), map.cend(), [&](const std::pair<const K, E> &item) {
            auto iter = unordered_map.find(item.first);
            return iter != unordered_map.end() && iter->second == item.second;
        });
}
Run Code Online (Sandbox Code Playgroud)

  • @Aminos:在这种情况下要注意,如果地图和无序地图使用不同的"相等键"定义,那么检查大小是否匹配,哪一个是另一个的子集,不一定足以测试它们是否为相同.例如,假设地图包含键"X"和"Y",unordered_map包含键"Y"和"Z",但也认为"X"和"Y"相等,因此报告"X"和"Y" `出席. (2认同)

for*_*ack 9

您可以unordered_map使用a 创建一个map,然后比较两个unordered_map.反之亦然.

std::unordered_map<std::string, std::string> m1;
std::map<std::string, std::string> m2;
std::unordered_map<std::string, std::string> m3(m2.begin(), m2.end());
if (m1 == m3) {}
Run Code Online (Sandbox Code Playgroud)

  • 与手动查找地图中的每个元素相比,这可能会有更好的时间复杂性.很好的答案. (2认同)
  • 实际上,这个和被接受的答案都具有相同的时间复杂度:O(n).但是,这个答案会对存储的元素进行多次分配和复制.接受的答案不是,它完全依赖于不可变数据. (2认同)