You need to enable JavaScript to run this app. 如何借助STL获取数组中所有最大值对应的元素索引
优惠活动
大模型
产品
解决方案
定价
更多

如何借助STL获取数组中所有最大值对应的元素索引

基于STL获取数组所有最大值对应索引的实现方法

整个实现完全依托STL标准能力完成,不需要自定义复杂的遍历逻辑,核心流程分为两步:

  • 第一步:调用std::max_element获取数组的全局最大值。无论数组内存在多少个重复的最大值元素,该函数返回的迭代器指向的数值就是数组的峰值,和最大值出现次数无关,天然适配多最大值的场景
  • 第二步:遍历数组,收集所有数值等于全局最大值的元素对应的索引,这一步既可以手写带索引计数的遍历逻辑,也可以完全用STL算法完成筛选

通用兼容实现(C++11及以上版本)

以下实现覆盖空数组边界判断,可直接用于生产环境:

#include <algorithm>
#include <vector>

std::vector<std::size_t> GetAllMaxValueIndices(const std::vector<int>& input_arr) {
    std::vector<std::size_t> index_collection;
    // 空数组直接返回空结果,避免解引用尾迭代器触发未定义行为
    if (input_arr.empty()) {
        return index_collection;
    }
    // 获取全局最大值
    const auto max_value = *std::max_element(input_arr.cbegin(), input_arr.cend());
    // 收集所有与最大值相等的元素索引
    for (std::size_t idx = 0; idx < input_arr.size(); ++idx) {
        if (input_arr[idx] == max_value) {
            index_collection.push_back(idx);
        }
    }
    return index_collection;
}

C++20 Ranges简化实现

如果使用支持C++20 Ranges特性的编译环境,可以省去手写计数循环的代码,用组合式STL算法完成同样的逻辑:

#include <algorithm>
#include <ranges>
#include <vector>

std::vector<std::size_t> GetAllMaxValueIndices(const std::vector<int>& input_arr) {
    if (input_arr.empty()) return {};
    const auto max_val = *std::ranges::max_element(input_arr);
    auto index_view = input_arr 
        | std::views::enumerate // 给每个元素附带从0开始的索引
        | std::views::filter([max_val](const auto& elem) { return elem.value == max_val; }) // 筛选出值等于最大值的条目
        | std::views::transform([](const auto& elem) { return elem.index; }); // 只保留索引值
    return {index_view.begin(), index_view.end()};
}

实现注意事项

  • 自定义类型适配:如果数组存储的是自定义结构体,只需要在调用max_element时传入和业务规则一致的自定义比较器,后续收集索引时复用同一套比较逻辑判断相等即可,保证阈值判断规则统一
  • 性能说明:整个流程为两次线性遍历,时间复杂度为O(n),和单次遍历的开销差异极小,可满足绝大多数数组处理场景的性能要求
  • 边界处理:数组为空时必须直接返回空结果,不能直接对max_element的返回迭代器解引用,否则会触发未定义行为

内容的提问来源于stack exchange,提问作者Alex Leitsin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 20:06:08