使用算法查找自定义数据向量中的最大值和最小值



我有一个这样的数据结构:

struct Speed {
       int set; //set by user
       int act; //actual speed
       int millis; //millis since epoch
}
vector<Speed> data;

现在我想画这个矢量。为了创建一个漂亮的轴,我想找到这个向量中数据的最大值和最小值。我确实喜欢这个,但显然,因为它仅基于set,如果在任何时候act小于或大于set,我会失望。我的意思是图表的Y轴应该介于最小 set, act 和最大值之间 set, act .

auto max = std::max_element(begin(data), end(data),
                            [&](const Speed& a, const Speed& b){
    return a.set() < b.set(); 
    //how about act?
});
auto min = std::min_element(begin(data), end(data),
                            [&](const Speed& a, const Speed& b){
    return a.set() < b.set();
    //how about act?
});
**

我知道**如何编写不涉及算法和lambda的正常代码来实现结果...但我有兴趣看看如何在结构中没有运算符重载的情况下使用算法/lambda。

我也可以对act做同样的事情,然后比较结果......但这会花费我 4 个循环!

一般来说,我会推荐最易读的代码。

因此,它将是这样的(假设至少有一个项目):

auto set_minmax = std::minmax_element(begin(data), end(data),
    [&](const Speed& a, const Speed& b) { return a.set < b.set; });
auto act_minmax = std::minmax_element(begin(data), end(data),
    [&](const Speed& a, const Speed& b) { return a.act < b.act; });
auto min_act_set = std::min(*set_minmax.first, *act_minmax.first);
auto max_act_set = std::max(*set_minmax.second, *act_minmax.second);

但是,如果数据真的很大或逻辑更复杂,我建议有一个累积统计数据并对数据进行某种循环的对象。

您可以在

std::min_element中使用std::minstd::maxstd::max_element调用。

#include <algorithm>
#include <iostream>
#include <vector>
struct Speed {
       int set;
       int act;
       int millis;
};
int main() {
    std::vector<Speed> data = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    auto max_val = std::max_element(begin(data), end(data),
                                    [](const Speed& a, const Speed& b){
        return std::max(a.set, a.act) < std::max(b.set, b.act);
    });
    auto min_val = std::min_element(begin(data), end(data),
                                    [](const Speed& a, const Speed& b){
        return std::min(a.set, a.act) < std::min(b.set, b.act);
    });
    std::cout << "MAX: " << max_val->set << " " << max_val->act << "n";
    std::cout << "MIN: " << min_val->set << " " << min_val->act << "n";
}

单次通过std::minmax在这里真的行不通。元素的每个比较都必须返回一个布尔值,其中true表示左侧小于右侧,false表示左侧大于或等于右侧(即需要严格的弱排序)。但是,在这里,单个元素既可以小于另一个元素,也可以大于另一个元素。您可以轻松地编写自己的函数来进行单次传递minmax_element,但我认为如果不进行两次传递,它就不适合现有的 STL 函数。

最新更新