C++如何获取vector中最小的4个元素并保留其原始索引
实现方案
这里提供两种常用的实现思路,你可以根据需求选择:
方案1:手动遍历实现(适合理解底层逻辑)
你当前使用的范围for循环只能获取元素值,无法拿到原始索引,所以需要改为下标遍历,同时维护一个存储当前最小4个元素索引的容器:
#include <vector> #include <algorithm> int main() { std::vector<double> double_vector {value_1,value_2,value_3,value_4,value_5,value_6,value_7,value_8,value_9,value_10}; // 存储最小4个元素的原始索引 std::vector<int> min_indexes; for (int i = 0; i < double_vector.size(); ++i) { double current_val = double_vector[i]; if (min_indexes.size() < 4) { // 还没凑够4个元素,直接加入 min_indexes.push_back(i); // 每次加入后按对应值从大到小排序,保证第一个元素是当前存储的4个里值最大的 std::sort(min_indexes.begin(), min_indexes.end(), [&](int a, int b) { return double_vector[a] > double_vector[b]; }); } else { // 已经凑够4个,当前值比存储的最大值更小就替换 if (current_val < double_vector[min_indexes[0]]) { min_indexes[0] = i; // 重新排序保证第一个还是最大值 std::sort(min_indexes.begin(), min_indexes.end(), [&](int a, int b) { return double_vector[a] > double_vector[b]; }); } } } // 可选:最后把结果按值从小到大排序,方便后续使用 std::sort(min_indexes.begin(), min_indexes.end(), [&](int a, int b) { return double_vector[a] < double_vector[b]; }); }
方案2:STL算法实现(代码更简洁高效)
针对取前K个最小元素的场景,直接用std::partial_sort局部排序算法更高效,不需要自己维护排序逻辑:
#include <vector> #include <algorithm> #include <numeric> int main() { std::vector<double> double_vector {value_1,value_2,value_3,value_4,value_5,value_6,value_7,value_8,value_9,value_10}; // 初始化索引数组,值为0~9对应所有元素的原始索引 std::vector<int> indexes(double_vector.size()); std::iota(indexes.begin(), indexes.end(), 0); // 局部排序:只把前4个位置按对应值从小到大排好,剩下的元素顺序不处理 std::partial_sort(indexes.begin(), indexes.begin() + 4, indexes.end(), [&](int a, int b) { return double_vector[a] < double_vector[b]; }); // 取前4个元素就是最小4个值对应的原始索引 std::vector<int> min_indexes(indexes.begin(), indexes.begin() + 4); }
结果验证
两种方案执行完成后,你可以通过如下方式遍历拿到对应的值和原始索引:
for (int idx : min_indexes) { std::cout << "原始索引:" << idx << " 对应数值:" << double_vector[idx] << std::endl; }
内容的提问来源于stack exchange,提问作者newtocomputers
相关产品推荐
相关产品推荐

