如何在C++中找出map中相同键对应的最大值?
在C++中找出重复键对应的最大值实现方案
下面提供几种实用的实现方式,针对你给出的键值对集合{(a,2),(b,3),(a,24),(c,8),(b,55)},目标是为每个键保留最大的对应值。
方法一:遍历键值对并维护最大值(通用场景)
这种方法适用于所有键值对的输入形式(比如存在vector、数组中),用std::map或std::unordered_map存储最终结果:
#include <iostream> #include <vector> #include <unordered_map> int main() { // 定义原始键值对集合 std::vector<std::pair<char, int>> pairs = {{'a', 2}, {'b', 3}, {'a', 24}, {'c', 8}, {'b', 55}}; // 用unordered_map存储每个键的最大值(如果需要有序输出用std::map即可) std::unordered_map<char, int> maxMap; for (const auto& pair : pairs) { char key = pair.first; int value = pair.second; // 如果键不存在,或者当前值大于已存值,更新 if (maxMap.find(key) == maxMap.end() || value > maxMap[key]) { maxMap[key] = value; } } // 输出结果 for (const auto& entry : maxMap) { std::cout << "键" << entry.first << "的最大值:" << entry.second << std::endl; } return 0; }
说明
- 用
std::unordered_map效率更高(平均O(1)查找),如果需要按键的顺序输出,换成std::map即可(内部有序,查找O(log n))。 - 遍历过程中自动完成最大值的更新逻辑,逻辑简单直接。
方法二:处理std::multimap(原始数据已存为允许重复键的容器)
如果你的原始数据已经存储在std::multimap中(它允许同一键对应多个值),可以利用equal_range获取同一键的所有值,再找出最大值:
#include <iostream> #include <multimap> #include <algorithm> int main() { // 初始化multimap,包含重复键 std::multimap<char, int> multiMap = {{'a', 2}, {'b', 3}, {'a', 24}, {'c', 8}, {'b', 55}}; std::unordered_map<char, int> maxMap; // 遍历每个唯一键 auto it = multiMap.begin(); while (it != multiMap.end()) { char key = it->first; // 获取当前键的所有值的范围 auto range = multiMap.equal_range(key); // 找出这个范围内的最大值 int maxVal = 0; for (auto rangeIt = range.first; rangeIt != range.second; ++rangeIt) { if (rangeIt->second > maxVal) { maxVal = rangeIt->second; } } maxMap[key] = maxVal; // 跳到下一个不同的键 it = range.second; } // 输出结果 for (const auto& entry : maxMap) { std::cout << "键" << entry.first << "的最大值:" << entry.second << std::endl; } return 0; }
说明
equal_range返回一个迭代器对,分别指向当前键的第一个元素和最后一个元素的下一个位置。- 遍历该范围即可找到对应键的最大值,适合原始数据已经是
multimap的场景。
方法三:利用STL算法简化代码(C++11及以上)
可以结合std::for_each和lambda表达式简化遍历逻辑,让代码更紧凑:
#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> int main() { std::vector<std::pair<char, int>> pairs = {{'a', 2}, {'b', 3}, {'a', 24}, {'c', 8}, {'b', 55}}; std::unordered_map<char, int> maxMap; std::for_each(pairs.begin(), pairs.end(), [&maxMap](const auto& pair) { if (maxMap[pair.first] < pair.second) { maxMap[pair.first] = pair.second; } }); // 输出结果 for (const auto& entry : maxMap) { std::cout << "键" << entry.first << "的最大值:" << entry.second << std::endl; } return 0; }
说明
- 这里利用了
unordered_map的特性:访问不存在的键时,会自动插入默认值(int的默认值是0),所以直接比较maxMap[pair.first]和当前值即可,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Gate computer science learning
相关产品推荐
相关产品推荐

