c++ - 查找 "masked vector"的最小元素的位置

标签 c++ vector

我有一个包含一些值的 vector 和一个包含 0 和 1 的掩码 vector 。例如:

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};

我需要在 vec 中找到最小元素(它的索引),但仅在 mask 为 1 的地方。在此示例中,它在索引 4 处为 1.8。

这是我使用循环的解决方案

double minVal = std::numeric_limits<double>::max();
int minIndex;
for (size_t i = 0; i < vec.size(); ++i)
{
    if (vec[i] < minVal && mask[i] == 1)
    {
        minVal = vec[i];
        minIndex = i;
    }
}

但我想知道是否有办法通过使用标准库(例如 std::min_element 和 lambdas),最好不使用 for 循环?

最佳答案

您可以转换为组合的 vector,使用 max double 作为掩码值的替换,并将其与 std::min_element

一起使用
#include <algorithm>
#include <iostream>
#include <limits>
#include <vector>

int main()
{
    std::vector<bool> 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};
    std::vector<double> combined;
    
    std::transform(vec.begin(), vec.end(), mask.begin(),
                   std::back_inserter(combined),
                   [](double v, bool mask) {
                       return mask ? v : std::numeric_limits<double>::max(); });
    
    auto it = std::min_element(combined.begin(), combined.end());
    std::cout << "min=" << *it << "\n";
    return 0;
}

https://ideone.com/FncV2r一个活生生的例子。


使用 std::distance

获取索引相当容易
std::cout << "index=" << std::distance(combined.begin(), it) << "\n";

将其应用于原始 vector 将是

auto index = std::distance(combined.begin(), it);
auto it_vec = vec.begin() + index;

https://ideone.com/U8AXtm


请记住,即使此解决方案使用标准算法和 lambda,提问者的简单 for 循环也更有效。

这是因为 for 循环不需要额外的空间(组合 vector ),并且在一次运行中完成,而 transformmin_element 需要两个循环产生相同的结果。

因此,有时会出现“老式”循环。

关于c++ - 查找 "masked vector"的最小元素的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70187754/

相关文章:

c++ - MFC 的网格、flexgrid 或 gridbag 布局

c++ - 不同的字符集有什么用?

c++ - 如何返回3个值之间的最大值?

c++ - 理解 vector 乘法

c++ - 此代码如何从两个二维 vector 的叉积中检索二维 vector ?

c++ - Visual Studio 不断嵌入错误的资源文件

c++ - 当对象创建为基类时,如何获取派生类型的shared_ptr?

python - 在 Cython 中包装返回复杂类型 Vector 的函数

r - 如何在 capscale 函数中仅输入环境变量作为因子(而不是连续变量)?

vector - 向量的子集