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

C++如何使用标准库查找掩码向量有效位置的最小元素索引

可以通过C标准库实现该需求,无需使用显式for循环,以下是两种兼容不同C版本的实现方案:

C++11 及以上兼容方案

通过std::iota生成索引序列,再结合std::min_element和自定义比较逻辑实现:

#include <algorithm>
#include <vector>
#include <numeric>
#include <iostream>
#include <limits>

int main() {
    std::vector<int> mask{0, 0, 1, 0, 1, 1, 0};
    std::vector<double> vec{7.1, 1.0, 3.2, 2.0, 1.8, 5.0, 0.0};

    // 生成0到vec.size()-1的索引序列
    std::vector<size_t> indices(vec.size());
    std::iota(indices.begin(), indices.end(), 0);

    auto min_idx_it = std::min_element(indices.begin(), indices.end(), [&](size_t a, size_t b) {
        bool a_valid = mask[a] == 1;
        bool b_valid = mask[b] == 1;
        // 有效元素优先级始终高于无效元素
        if (a_valid && !b_valid) return true;
        if (!a_valid && b_valid) return false;
        // 两个都是有效元素时比较对应vec的值
        if (a_valid && b_valid) return vec[a] < vec[b];
        // 两个都是无效元素时优先级相同
        return false;
    });

    // 处理无有效元素的边界情况
    if (mask[*min_idx_it] == 1) {
        std::cout << "最小元素索引:" << *min_idx_it << ",值:" << vec[*min_idx_it] << std::endl;
    } else {
        std::cout << "不存在mask为1的有效元素" << std::endl;
    }
    return 0;
}

C++20 优化方案

借助范围库的std::views::iota无需额外构造索引向量,内存效率更高:

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

int main() {
    std::vector<int> mask{0, 0, 1, 0, 1, 1, 0};
    std::vector<double> vec{7.1, 1.0, 3.2, 2.0, 1.8, 5.0, 0.0};

    // 直接生成索引视图,无额外内存开销
    auto indices = std::views::iota(0u, vec.size());
    auto min_idx = std::ranges::min_element(indices, [&](size_t a, size_t b) {
        bool a_valid = mask[a] == 1;
        bool b_valid = mask[b] == 1;
        if (a_valid && !b_valid) return true;
        if (!a_valid && b_valid) return false;
        if (a_valid && b_valid) return vec[a] < vec[b];
        return false;
    });

    if (mask[*min_idx] == 1) {
        std::cout << "最小元素索引:" << *min_idx << ",值:" << vec[*min_idx] << std::endl;
    } else {
        std::cout << "不存在mask为1的有效元素" << std::endl;
    }
    return 0;
}

注意:使用前请确保mask和vec的长度完全一致,否则会触发越界访问的未定义行为。

上述两种方案运行你的示例输入都会得到结果:最小元素索引为4,对应值为1.8,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:03