1

私は現在、std::functional の std::greater、std::lesser などのようなクラスに出くわしています。

ご覧のとおり、これらのクラスは <> を使用しているため、任意のデータ型で使用できます。そこで、bool 演算子をオーバーロードして、これらのクラスに順序を「適切に」認識させようとしました。

ただし、これは私が試したものであり、適切に機能しませんでした。

#include <iostream>
#include <queue>
#include <vector>
#include <functional>

class MyClass
{
    public:
        MyClass(int x, std::string str) {(*this).x = x; (*this).str = str;}
        int getInt()const{return (*this).x;}
        std::string getStr(){return this->str;}
        bool operator <(const MyClass& ot)const{return (*this).getInt() < ot.getInt();}
        bool operator >(const MyClass& ot)const{return (*this).getInt() > ot.getInt();}
    private:
        int x;
        std::string str;
};
int main()
{
    std::priority_queue<MyClass*,std::vector<MyClass*>,std::less<MyClass*> > MinQ;
    std::priority_queue<MyClass*,std::vector<MyClass*>,std::greater<MyClass*> > MaxQ;
    MyClass *m = new MyClass(1,"one");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(36,"thirty six");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(47,"forty six");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(1,"first");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(2,"second");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(2,"two");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(7,"seven");
    MinQ.push(m); MaxQ.push (m);
    m = new MyClass(28,"twenty eight");
    MinQ.push(m); MaxQ.push (m);

    while(!MinQ.empty())
    {
        std::cout<<MinQ.top()->getStr()<<std::endl; MinQ.pop();
    }
    std::cout<<"------------------------------------------------"<<std::endl;
    while(!MaxQ.empty())
    {
        std::cout<<MaxQ.top()->getStr()<<std::endl; MaxQ.pop();
    }

}

結果:

twenty eight
seven
two
second
thirty six
forty six
first
one
------------------------------------------------
one
first
forty six
thirty six
second
two
seven
twenty eight

誰かがこれについて説明したり、これを行う適切な方法についてアドバイスをくれたりできますか?

4

1 に答える 1

2

問題は、オブジェクトではなくデータ構造でポインターを使用していることです。

解決策は 2 つあります。ポインタで動作するファンクタを作成します。

struct Greater
{
    bool operator()(MyClass *a, MyClass *b) const
    {
        return *a > *b;
    }
};

std::priority_queue<MyClass*,std::vector<MyClass*>, Greater > MaxQ;

オブジェクトを直接操作するかのどちらかです (このアプローチを強くお勧めしますが、常に適用できるとは限りません)。

std::priority_queue<MyClass,std::vector<MyClass>, std::less<MyClass> > MinQ;
于 2013-07-08T13:51:59.653 に答える