9

私の優先キューは次のように宣言されています:

std::priority_queue<*MyClass> queue;

class MyClass {
    bool operator<( const MyClass* m ) const;
}

キュー内のアイテムを並べ替えていません。

なにが問題ですか?別の (Compare) クラスを実装したくありません。

回答の要約:

問題は、ポインタ アドレスがソートされていることです。これを回避する唯一の方法は、「ポインターを比較する」クラスです。

現在、次のように実装されています。

std::priority_queue<*MyClass, vector<*MyClass>, MyClass::CompStr > queue;

class MyClass {
    struct CompStr {
        bool operator()(MyClass* m1, MyClass* m2);
    }
}
4

4 に答える 4

11

キューに比較ファンクターptr_lessを与えます。

ptr_lessを残りのstdライブラリ(バインダー、コンポーザー、...)と互換性を持たせたい場合:

template<class T>
struct ptr_less
    : public binary_function<T, T, bool> {  
        bool operator()(const T& left, const T& right) const{
            return ((*left) <( *right));
        }
};

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less<MyClass*> > que; 

それ以外の場合は、簡略化されたバージョンで逃げることができます。

struct ptr_less {
    template<class T>
    bool operator()(const T& left, const T& right) const {
        return ((*left) <( *right));
    }
};

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less > que; 
于 2009-06-12T10:56:26.537 に答える
4

指定した演算子 <() は、 MyClass オブジェクトを MyClass オブジェクトへのポインターと比較します。しかし、あなたのキューにはポインタしか含まれていません(私は思う)。2 つのポインターをパラメーターとして受け取る比較関数が必要です。

これはすべて、いくつかの仮定に基づいています。コピーと貼り付けを使用して、実際のコードを投稿してください。

于 2009-06-12T10:31:41.650 に答える
4

ポインター値のみが含まれてpriority_queueいるため、ポインターにはデフォルトの比較演算子が使用されます。これにより、ポインターがアドレスでソートされますが、これは明らかに必要なものではありません。priority_queueクラス インスタンスを値で格納するように変更すると、定義した演算子が使用されます。または、比較関数を提供する必要があります。

于 2009-06-12T10:35:37.227 に答える
3

私はそれを使用したことがないため、優先キューについてはわかりませんが、単純な並べ替えを行うには、次のようにします。

class A
{
    friend struct ComparePtrToA;
public:
    A( int v=0 ):a(v){}
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return a1->a < a2->a;}
};

#include <vector>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
    vector<A*> someAs;
    someAs.push_back(new A(1));
    someAs.push_back(new A(3));
    someAs.push_back(new A(2));
    sort( someAs.begin(), someAs.end(), ComparePtrToA() );
}

メモリリークに注意してください。これは単なる例です...

さらに注意: これは優先キューの実装を意図したものではありません! ベクトルは、私が作成したファンクターを使用して、ポインターを介して 2 つのオブジェクトを比較する単なる例です。プライオリティ キューとは何か、おおまかなしくみは知っていますが、それらを実装する STL 機能を使用したことはありません。

更新: TimW はいくつかの有効な点を指摘していると思います。なぜ彼がそんなに反対票を投じられたのか、私にはわかりません。私の答えは次のように改善できると思います:

class A
{
public:
    A( int v=0 ):a(v){}
    bool operator<( const A& rhs ) { return a < rhs.a; }
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return *a1 < *a2;}
};

これはよりクリーンです(特に、ポインターではなく値のコンテナーを使用することを検討している場合-それ以上の作業は必要ありません)。

于 2009-06-12T11:00:27.713 に答える