如何使用包含 <algorithm> 中的 STL max 用于用户定义的数据类型
Posted
技术标签:
【中文标题】如何使用包含 <algorithm> 中的 STL max 用于用户定义的数据类型【英文标题】:How to use STL max from include <algorithm> for user defined data type 【发布时间】:2013-10-24 09:07:05 【问题描述】:我有一个简单的课程
class sample
int i;
public:
sample(int i): i(i)
;
int main()
cout << max (12, 26) << endl; // working fine
sample s1(10), s2(20);
cout << max (s1, s2); // lots of compilation errors
return 0;
我希望 max (s1, s2) 应该返回 max (s1, s2) 的最大值。我知道我错过了一些东西,但无法想象这些东西。
任何帮助将不胜感激。
开发
【问题讨论】:
尝试阅读错误,它们会准确告诉您缺少什么。 不必要的反对票 @AliAlamiri:再次阅读不赞成的鼠标悬停文本 @PlasmaHH 这个问题很清楚也很有用。因为这个问题,我实际上学到了一些新东西。该问题符合所有 SO 标准。 【参考方案1】:您有两个选择:首先,实现一个operator<
,例如,
bool operator<(const sample& lhs, const sample& rhs)
return lhs.i < rhs.i;
请注意,在这种特殊情况下,i
是 private
,因此必须将上面的运算符声明为 friend
的 sample
。或者,您可以使用成员1:
class sample
// as before ...
bool operator<(const sample& rhs) const return i < rhs.i;
;
其次,使用带二进制比较函子的重载,所以你可以说
std::max(s1, s2, comp);
comp
可以是类似的东西
bool comp(const sample& lhs, const sample& rhs)
return lhs.i < rhs.i; // or other logic
1 非成员是首选,因为它在 LHS 和 RHS 之间具有完美的对称性。使用成员时不是这种情况。这可能是使用隐式转换构造函数时的问题
【讨论】:
另一种选择是实现std::max
的特化,对吗?
@MagnusHoff 我想这是允许的。但是,我更喜欢上面的两个选项:要么根据小于运算符确定最大值,要么明确说明您使用的比较。专门化std::max
可能会隐藏比较逻辑或使其与现有operator<
不一致。
你能用 lambda 代替传递函数吗?
只定义 max,而不是专门化 std::max,让 ADL 拥有 5 分钟的荣耀不是更好
@DeveshAgrawal 该错误是因为您试图将sample
传递给std::cout
。为此,您需要重载另一个运算符。但这是一个不同的问题,在 SO 上有很多重复的问题。【参考方案2】:
class sample
public:
int i;
sample(int i): i(i)
bool operator< (const sample& other) const
return i < other.i;
;
int main()
sample s1(10), s2(20);
max (s1, s2);
return 0;
注意 const
在 operator <
之后,这很重要。 :)
【讨论】:
以上是关于如何使用包含 <algorithm> 中的 STL max 用于用户定义的数据类型的主要内容,如果未能解决你的问题,请参考以下文章
C++ <algorithm> sort() 使用对象作为比较定义