获取包含最小值的struct数组的索引

时间:2014-12-15 00:54:42

标签: c++ winapi

编辑:我非常感谢答案!

想象一下,我们有一个这样的结构

struct BadQuestion
{
   float a;
   float b;

} BadArray[10];

在典型的一天float a将如下所示

{ 0, 152.52, 25.26, 5.166, 263.25, 256.256, 452.25, 0, 0, 0 }

现在我需要找到最小值(5.166)并获取数组中的索引(这将是3),因为稍后我将需要从float b中提取BadArray[3]

当然,我不想在搜索中包含0值。我厌倦了将所有非0值添加到矢量然后使用min_element来获得float a的最低值。问题是我不知道如何获得索引。

当前代码

vector<float> temp;
int size = 0;
for (int i = 0; i < 10; i++)
{
    if (BadArray[i].a != 0) {
        temp.push_back(BadArray[i].a);
        size++;
    }
}

auto entity = min_element(temp.begin(), temp.end());

4 个答案:

答案 0 :(得分:2)

float lowestvalue = FLT_MAX; //float max
int index = -1;
for(int i = 0; i < 10; i++)
{
     if(BadQuestion[i].a < lowestvalue && BadQuestion[i].a != 0)
     {
         lowestvalue = BadQuestion[i].a;
         index = i;
     }
}

float patato = BadQuestion[index].b;

答案 1 :(得分:0)

所以使用自定义比较器!这是一个相当冗长的问题:

#include <array>
#include <iostream>

int main() {
    std::array<float, 10> arr = {0, 152.52, 25.26, 5.166, 263.25, 256.256, 452.25, 0, 0, 0};

    auto it = std::min_element(begin(arr), end(arr), [](float lhs, float rhs) -> bool {
        if (lhs == rhs)
            return false;
        if (lhs == 0)
            return false;
        if (rhs == 0)
            return true;
        return lhs < rhs;
    });

    std::cout << std::distance(begin(arr), it) << "\n";
}

输出:

3

我们也可以在BadQuestion

上执行此工作
struct BadQuestion {
    float a;
    float b;
};

int main() {
    std::array<struct BadQuestion, 3> arr;

    arr[0] = {12, 3};
    arr[1] = {0, 17};
    arr[2] = {9, 14};

    auto it = std::min_element(begin(arr), end(arr), [](BadQuestion const & lhs, BadQuestion const & rhs) -> bool {
        if (lhs.a == rhs.a)
            return false;
        if (lhs.a == 0)
            return false;
        if (rhs.a == 0)
            return true;
        return lhs.a < rhs.a;
    });

    std::cout << std::distance(begin(arr), it) << "\n";
    std::cout << it->b << "\n";
}

答案 2 :(得分:0)

我不确定我是否完全理解你的问题,但这里是

#include <limits>
float min = numeric_limits<float>::max();
int minIndex = 0;
for (int i = 0; i < (sizeof(BadArray) / sizeof(BadArray[0])); i++) {
    if ((BadArray[i].a > 0) && (BadArray[i].a < min)) {
        min = BadArray[i].a;
        minIndex = i;
    }
}

答案 3 :(得分:0)

这是一种有趣的方式,与其他例子完全不同:让我们使用Boost.Ranges

float arr[] = { 0, 152.52, 25.26, 5.166, 263.25, 256.256, 452.25, 0, 0, 0 };

auto it = boost::min_element(
    arr | boost::adaptors::filtered(non_zero{}));

使用:

struct non_zero {
    bool operator()(float f) { return f != 0.0; }
};

此时,*it == 5.166(&*it - arr) == 3是您的索引。 min_element如果你想让它在你的结构上工作,也需要一个比较器,所以你的non_zero也必须改变以考虑它,但结构看起来是一样的:基本上这让我们分开了min_element部分来自filtered部分,非常好。