You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:25:21