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
相关产品推荐
相关产品推荐

