想象一下,我们有一个这样的结构
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());
答案 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
部分,非常好。