如何借助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
相关产品推荐
相关产品推荐

