如何从具有最高值的 unordered_map 中获取密钥?

Posted

技术标签:

【中文标题】如何从具有最高值的 unordered_map 中获取密钥?【英文标题】:How to get the key from an unordered_map with the highest value? 【发布时间】:2021-04-25 00:00:02 【问题描述】:

我有以下代码查看是否存在键,如果存在,则返回键和值:

std::unordered_map<std::string, int64_t> id_to_last_observation(
        "apple", 10,
        "lily", 12,
        "avocado", 2,
        "derry", 5,
        "elephant", 13,
        "monkey", 33,
        "pineapple", 555, 
        "car", 1,
        "ireland", 67,
        "family", 48,
        "laptop", 4,
        "ladder", 90, // element that begins with l that has the highest value
        "computer", 98,
        "travel", 99,
        "orchestra", 65,
        "party", 16,
        "cube", 5, 
        "roller-coaster", 8,
        "snake", 0,
        "map", 11,
        "umbrella", 51,
        "lock", 47,
        "person", 92,
        "phone", 89,
        "pen", 81,
    );

    std::unordered_map<std::string, int64_t>::iterator it;

    it = id_to_last_observation.find("ladder");

    if (it != id_to_last_observation.end())
        std::cout << "Element Found - ";
        std::cout << it ->first<< "::" << it->second<< std::endl;
    else
        std::cout << "Element Not Found" << std::endl;
    return 0;

但是,我在这里手动操作。我想要做的是获取以我想要的任何字母开头并且具有我想要的任何值(最高、最低等)的元素。所以如果我想要以l 开头的元素,并且在所有以l 开头的元素中值最高,我想返回ladder

有没有办法在不使用暴力破解的情况下有效地做到这一点?

【问题讨论】:

有没有办法在不使用暴力破解的情况下有效地做到这一点? -- 鉴于您需要所有这些额外信息,您应该首先想到的应该是保存此信息的辅助数据结构。 第二件事是,在实际程序中,您可能没有硬编码这些映射条目,而是在某种循环中以编程方式生成它们。如果是这种情况,那么显而易见的解决方案是记录添加的条目,并使用最高值的信息更新另一个数据结构,可能是另一个映射。您需要更具体地了解初始地图的实际构建方式。但即便如此,一个 26 个条目的小地图也不值得尝试找出更快的方法,IMO。 听起来您实际上想要一个从第一个字母到一系列单词和值对的映射,并按值排序。 也许unordered_map 不是最好的选择?根据您的用例,看起来像是一个 trie 与一个堆的组合。 “我必须使用 unordered_map 来完成这项任务。” - 这仍然是模糊的。您必须使用unordered_map吗?如果是这样,那么您必须进行蛮力搜索。如果您可以使用补充容器,最好取决于是否可以删除 id_to_last_observation 条目;如果您只是插入新值,则可以在插入具有更高值的单词时更新std::array&lt;decltype(id_to_last_observation::iterator), 26&gt;。要支持擦除,请考虑使用 priority_queues 或集合的数组,按数值排序。 【参考方案1】:

不,没有内置方法可以做到这一点。这就是“无序”的意思。根据定义:无序映射中的值不按任何特定顺序存储。

即使对于一个常规的、有序的std::map:如果使用得当,它的可用方法唯一能给你的就是键的范围,但你仍然需要搜索它们。

请注意,在unordered_mapmap 中,值是可修改的,您可以随时修改存储在任何键下的值,而地图根本不会关心。那么,鉴于此,您如何期望您的地图甚至有任何方法可以做到这一点?

【讨论】:

我没有问是否有内置方法可以做到这一点。我在问是否有一种有效的方法可以在没有暴力破解的情况下找到元素。为了这个任务,我必须使用 unordered_map。我可以强行这样做,但如果有办法减少最坏情况,我宁愿不这样做。 第一段的最后一句直接回答了这个问题:没有。无序的意思是:无序的。无序映射中没有特定的键顺序。如果在无序映射中没有特定的键顺序,那么根据定义,暴力是唯一可以做的事情。

以上是关于如何从具有最高值的 unordered_map 中获取密钥?的主要内容,如果未能解决你的问题,请参考以下文章

csharp 如何在多维数组中找到具有最高和的大小为2乘2的子矩阵的示例。从计算机程序基础

csharp 如何在多维数组中找到具有最高和的大小为2乘2的子矩阵的示例。从计算机程序基础

从多个对象数组中返回具有最高值的对象

从 Perl 中的哈希中获取具有最高值的键的最简单方法是啥?

如何在 unordered_map 的键中使用 std::tr1::function 对象?

map和unordered_map的区别