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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:54:02