如何使用包含<algorithm>的STL max用于用户定义的数据类型</algorithm>

时间:2013-10-24 09:07:05

标签: c++ stl

我有一个简单的课程

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)。我知道我错过了一些东西,但却无法想象这些东西。

任何帮助将不胜感激。

Devesh

2 个答案:

答案 0 :(得分:7)

您有两种选择:首先,实施operator<,例如,

bool operator<(const sample& lhs, const sample& rhs)
{
  return lhs.i < rhs.i;
}

请注意,在此特定情况下,iprivate,因此上述运算符必须声明为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之间具有完美的对称性。使用成员时不是这种情况。使用隐式转换构造函数时,这可能是一个问题

答案 1 :(得分:0)

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 <,这很重要。 :)