【发布时间】: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<decltype(id_to_last_observation::iterator), 26>。要支持擦除,请考虑使用priority_queues 或集合的数组,按数值排序。
标签: c++ algorithm unordered-map