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 с лямбдой.
#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, относящееся к максимальному person в векторе x на основе ваших критериев сравнения. Если вы хотите сравнить несколько полей в каждой структуре, вы можете использовать что-то вроде std::tie, просто убедитесь, что ваша функция сравнения удовлетворяет «строгий слабый порядок».
вот исправленная версия вашего кода. Как показывает кори, вы можете сделать это с помощью стандартных алгоритмов гораздо чище.
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);
}
Обратите внимание на то, что пользователь может пропустить пустой вектор. В этом случае возвращать объект типа person не имеет смысла.
Лучше возвращать итератор, указывающий на максимальный элемент или последний итератор диапазона элементов вектора в случае, когда вектор пуст.
Вы можете использовать стандартный алгоритм 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;
} );
}
};
//...