如何使用包含 <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&lt;,例如,

bool operator<(const sample& lhs, const sample& rhs)

  return lhs.i < rhs.i;

请注意,在这种特殊情况下,iprivate,因此必须将上面的运算符声明为 friendsample。或者,您可以使用成员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&lt; 不一致。 你能用 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; 

注意 constoperator &lt; 之后,这很重要。 :)

【讨论】:

以上是关于如何使用包含 <algorithm> 中的 STL max 用于用户定义的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

C++ <algorithm> sort() 使用对象作为比较定义

[C++ STL] 常用算法总结

STL之算法总结

标准模板库使用参考——vector向量容器

C++ 用 <algorithm> 屏蔽字符串的所有字符,除了最后 n 个字符

如何确定函数来自哪个头文件?