在 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;
} );
}
};
//...
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;
} );
}
};
//...