在 vector c++ 中找到结构构造的最大值

finding max value of a struct construction inside vector c++

enum class comp {
    age,
    weight
};
struct person {
    int age;
    int weight;
    static auto max(std::vector<person> x, comp(y)) {
        if (comp(y) == comp::age) {
            for (person e : x) {
                auto max = 0;
                for (card e : x) {
                    if (max < e)
                        max = e;
                }

            }
        }

我试图从结构构造的这个向量中找到年龄、体重的最大值。

您可以使用 std::max_element 代替 lambda

#include <algorithm>

auto it_max = std::max_element(x.begin(), e.end(), [](auto const& lhs, auto const& rhs) {
    return lhs.age < rhs.age;  // or whatever you want to compare
}

那么 it_max 是一个 std::vector<person>::iterator,根据您的比较标准,引用向量 x 中的最大值 person。如果你想比较每个结构中的多个字段,你可以使用类似 std::tie just make sure your comparison function satisfies "strict weak ordering".

的东西

这是您的代码的更正版本。正如 cory post 所示,您可以使用标准算法以更简洁的方式做到这一点

struct person {
    int age;
    int weight;
    static int max(std::vector<person> x, comp y) {
        if (y == comp::age) {
            for (person e : x) {
                auto max = 0;
                for (auto e : x) {
                    if (max < e.age)
                        max = e.age;
                }
               return max;
            }
        }
        return 0;
    }
};
int main()
{
   person p1;
   person p2;
   p1.age=42;
   p2.age=4;
   std::vector<person> pp{p1,p2};
   int maxAge = person::max(pp, comp::age);

}

注意用户可以传递空向量。在这种情况下 return person 类型的对象没有意义。

如果向量为空,最好return一个指向向量元素范围的最大元素或最后一个迭代器的迭代器。

您可以通过以下方式使用标准算法std::max_element

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

enum class comp {
    age,
    weight
};

struct person {
    int age;
    int weight;

    static auto max( const std::vector<person> &v, comp cmp ) 
    {
        return std::max_element( std::begin( v ), std::end( v ),
            [=]( const auto &p1, const auto &p2)
            {
                return cmp == comp::age ? p1.age < p2.age
                                        : p1.weight < p2.weight;
            } );
    }               
};
//...