我需要找到向量的最大元素。我想使用 max_element 中的STL图书馆。
我尝试过的代码是:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class A
{
public:
A(int _size, long _len) : size(_size), len(_len){}
int size;
long len;
};
bool CompareMaxA(const A& _a, const A& _b)
{
return _a.len > _b.len;
}
int main() {
vector<A> vec;
A a1(3, 10);
A a2(5, 30);
vec.push_back(a1);
vec.push_back(a2);
auto it = max_element(vec.begin(), vec.end(), CompareMaxA);
cout << "max = " << it->len;
return 0;
}
我得到 max = 10,而不是 max = 30。为什么?
你的比较函数做了错误的事情。它返回true
每当_a.len
is greater than _b.len
, but std::max_element
需要一个返回的自定义比较函数true
在完全相反的情况下。从 cppreference 开始std::max_element:
参数
[...]
comp- 比较函数对象(即满足 Compare 要求的对象),如果第一个参数为,则返回 trueless比第二个。
你可以通过以下方式修复它
bool lessThanByLen(const A& _a, const A& _b)
{
return _a.len < _b.len;
}
auto it = max_element(vec.begin(), vec.end(), lessThanByLen);
为顺序关系使用/传递给标准库的自定义比较器始终寻求小于关系。在本例中,算法名称 (max_element
) 表示应找到最大值。
请注意,正如 @JeJo 在评论中指出的那样,您还可以考虑传递 lambda:
auto it = max_element(vec.begin(), vec.end(),
[](const A& lhs, const A& rhs) { return lhs.len < rhs.len; });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)