使用函数对象按降序排序包含模板用户定义类的stl向量

时间:2015-09-07 05:37:45

标签: c++ stl

在排序用户定义对象的向量时,我遇到了一个问题。我正在使用stl定义的排序算法并将其传递给我的函数对象,但它拒绝编译,请你帮我解决。

感谢。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

template<typename T>
class MyType
{
    public:
    T t1;
    public:
    MyType()
    {

    }
    MyType(const MyType& mt)
    {
        t1 = mt.t1;
    }
    MyType& operator=(const MyType& mt)
    {
        this->t1 = mt.t1;
        return *this;
    }
    bool operator<(const MyType& mt)
    {
        if(this->t1 < mt.t1)
            return true;
        else
            return false;
    }
    bool operator==(const MyType& mt)
    {
        if(this->t1 == mt.t1)
            return true;
        else
            return false;
    }
    MyType(T t)
    {
        t1 = t;
    }
};

template<class T>
class cmp_greater
{
    public:
    bool operator()(const T& a, const T& b)
    {
        return !(a < b);
    }
};

int main()
{
    MyType<int> m1(1);
    MyType<int> m2(2);
    MyType<int> m3(3);

    vector<MyType<int> > vmt;

    vmt.push_back(m1);
    vmt.push_back(m2);
    vmt.push_back(m3);

    vector<MyType<int> >::iterator pos;

    for(pos = vmt.begin(); pos != vmt.end(); pos++)
    {
        cout<<pos->t1<<endl;
    }

    sort(vmt.begin(), vmt.end(), cmp_greater<MyType<int> >() );
    cout<<"After sorting in decending order."<<endl;
    for(pos = vmt.begin(); pos != vmt.end(); pos++)
    {
        cout<<pos->t1<<endl;
    }

    vmt.erase(vmt.begin()+1);

    cout<<"after erase"<<endl;

    for(pos = vmt.begin(); pos != vmt.end(); pos++)
    {
        cout<<pos->t1<<endl;
    }

    //insert can also be used in vectors;
}

1 个答案:

答案 0 :(得分:2)

bool operator<(const MyType& mt)

应该声明为const,如

bool operator<(const MyType& mt) const

否则,bool cmp_greater::operator()(const T& a, const T& b)无法调用重载的less-than运算符。