如何获取std :: unordered_map的max元素?

时间:2019-05-02 23:05:42

标签: c++ c++17 unordered-map

我知道如何通过使用std::map来检索std::max_element的最大元素,但是由于容器类型之间的差异,无法使用std::unordered_map获得相同的效果

如何在std::unordered_map中找到最大值并返回相应的std::pair

显示了我目前使用std::map进行此操作的方法(基于this answer)。我似乎无法弄清楚std::unordered_map的操作方法。

template <typename KEY_T, typename VALUE_T>
std::pair<KEY_T, VALUE_T> findMaxValuePair(
    std::map<KEY_T, VALUE_T> const &x)
{
    return *std::max_element(x.begin(), x.end(),
                             [](const std::pair<KEY_T, VALUE_T> &p1,
                                const std::pair<KEY_T, VALUE_T> &p2)
                             {
                                 return p1.second < p2.second;
                             });
}

当我尝试在std::unorderd_map上使用上述功能(将std::map替换为std::unordered_map时,会收到Segmentation fault (core dumped)

2 个答案:

答案 0 :(得分:2)

使代码适用于unordered_map

在这种情况下,我们实际上可以通过将类型从map更改为unordered_map来做到这一点。

之前:

template <class Key, class Value>
std::pair<Key, Value> findMaxValuePair(
    std::map<Key, Value> const &x)
{
    return *std::max_element(x.begin(), x.end(),
                             [](const std::pair<Key, Value> &p1,
                                const std::pair<Key, Value> &p2)
                             {
                                 return p1.second < p2.second;
                             });
}

之后:我们将类型更改为unordered_map

template <class Key, class Value>
std::pair<Key, Value> findMaxValuePair(
    std::unordered_map<Key, Value> const &x)
{
    return *std::max_element(x.begin(), x.end(),
                             [](const std::pair<Key, Value> &p1,
                                const std::pair<Key, Value> &p2)
                             {
                                 return p1.second < p2.second;
                             });
}

使代码适用于两者

我们可以简单地编写一个可与​​所有标准容器一起使用的函数!这将适用于地图,向量,列表以及几乎所有定义begin()end()value_type的其他事物!

template <class Container>
auto findMaxValuePair(Container const &x) 
    -> typename Container::value_type
{
    using value_t = typename Container::value_type;
    const auto compare = [](value_t const &p1, value_t const &p2)
    {
        return p1.second < p2.second;
    };
    return *std::max_element(x.begin(), x.end(), compare);
}

segfault呢?

如果映射或容器为空,则此代码可能会段错误,这可能是因为您正在访问您不拥有的内存;因为map::end()所指向的内存包含垃圾,然后您尝试从中构造出类似字符串的东西,或者因为它表示为空指针。

特别是对于地图,如果存在内存损坏,这也可能导致段错误,尽管与尝试遍历地图的方式无关,这都是正确的。

答案 1 :(得分:0)

首选有序地图,但要优先选择钥匙。您在这里追求价值。无论哪种情况,您都需要遍历整个地图顺序的Troough来找到最大值。有序映射可以有效地找到最大或最小键,但不能找到值。因此,所采用的方法将适用于无序或有序地图。