7

同様のスレッドがあることは知っていますが、プログラムを強制的に動作させるために 1 時間費やした後、助けを求めることにしました。初めに。PHP(私が最もよく知っているプログラミング言語)では非常に単純で、c ++では非常に複雑なもの(少なくとも私にとっては非常に複雑)を試したので、私はc ++をかなりよく知っていると思いました。そこで、struct のポインタの priority_queue を作成したいと思います。独自の比較関数を作成する必要があることは明らかです。だから私はこのコードを試しました:

#include <iostream>
#include <list>
#include <queue>

using namespace std;

typedef struct MI
{
    int nr;
    int koszt;
    bool operator<(const MI& a, const MI& b) {
      return a.koszt > b.koszt;
}
} miasto, *miasto_wsk;

int main()
{
    priority_queue<miasto_wsk> q;
    miasto_wsk mi;
    mi = new miasto;
    mi->nr = 1;
    mi->koszt = 2;
    q.push(mi);
}

そして、プログラムをコンパイルしようとすると、コンパイルエラーが発生しました:

test.cpp:11:44: error: ‘bool MI::operator<(const MI&, const MI&)’ must take exactly one argument

私が間違っていることを説明して、構造体を使用したこのすべてのものがどのように機能するかを説明してください(または、最初からそれを説明する優れたチュートリアル/記事を教えてください)

編集:

コードを次のように変更しました。

#include <iostream>
#include <list>
#include <queue>

using namespace std;

typedef struct miasto 
{
    int nr;
    int koszt;
} *miasto_wsk;

bool myComparator(miasto_wsk arg1, miasto_wsk arg2) {
      return arg1->koszt < arg2->koszt; //calls your operator
}

int main()
{
    priority_queue<miasto_wsk, vector<miasto_wsk>, myComparator> q;
    miasto_wsk mi;
    mi = new miasto;
    mi->nr = 1;
    mi->koszt = 2;
    q.push(mi);
}

そして今、私はこのエラーメッセージを受け取ります:

test.cpp: In function ‘int main()’:
test.cpp:19:64: error: type/value mismatch at argument 3 in template parameter list for ‘template<class _Tp, class _Sequence, class _Compare> class std::priority_queue’
test.cpp:19:64: error:   expected a type, got ‘myComparator’
test.cpp:19:67: error: invalid type in declaration before ‘;’ token
test.cpp:24:7: error: request for member ‘push’ in ‘q’, which is of non-class type ‘int’

何が問題ですか?たぶん、構造体へのポインターの代わりに構造体のコピーを使用する必要がありますか?

EDIT2

このコードは、コンパイル エラーを生成しません。

#include <iostream>
#include <list>
#include <queue>

using namespace std;

typedef struct miasto 
{
    int nr;
    int koszt;
    bool operator< (const miasto& rhs)
    {
    koszt > rhs.koszt;
    }
} *miasto_wsk;

int main()
{
    priority_queue<miasto_wsk> q;
    miasto_wsk mi;
    mi = new miasto;
    mi->nr = 1;
    mi->koszt = 22;
    q.push(mi);
}

したがって、@Angew の考えは間違っているようです。

EDIT3: これは私の最終的なコードです。エラーなしでコンパイルするだけでなく、私がやりたいことを正確に実行します。どうもありがとう@Angew

#include <iostream>
#include <list>
#include <queue>

using namespace std;

typedef struct miasto 
{
    int nr;
    int koszt;
} *miasto_wsk;

struct MyComparator {
    bool operator() (miasto_wsk arg1, miasto_wsk arg2) {
        return arg1->koszt > arg2->koszt; //calls your operator
    }
};


int main()
{
    //priority_queue<miasto_wsk, vector<miasto_wsk>, myComparator> q;
    priority_queue<miasto_wsk, vector<miasto_wsk>, MyComparator> q;
    miasto_wsk mi;
    mi = new miasto;
    mi->nr = 1;
    mi->koszt = 22;
    q.push(mi);
    miasto_wsk mi1;
    mi1 = new miasto;
    mi1->nr = 2;
    mi1->koszt = 50;
    q.push(mi1);
    miasto_wsk mi2;
    mi2 = new miasto;
    mi2->nr = 3;
    mi2->koszt = 1;
    q.push(mi2);

    cout << q.top()->koszt << endl;
    q.pop();
    cout << q.top()->koszt << endl;
    q.pop();
    cout << q.top()->koszt << endl;
    q.pop();
}
4

4 に答える 4

7

ここには複数の問題があります。

クラス内で演算子を定義すると、最初の引数としてクラスタイプのパラメーターが自動的に取得されるため、そのパラメーターを作成しないでください。したがって、次のように、演算子をクラスに保持します。

struct MI {
  bool operator< (const MI&);
};

または、オペレーターを自立型として宣言します。

struct MI {
  //...
};
bool operator< (const MI&, const MI&);

次に、のインスタンスではなく、へのpriority_queueポインタを格納するため、演算子はとにかく呼び出されません。次のように、優先度キューを定義するときにコンパレータを提供する必要があります(編集済み)。MIMI

struct MyComparator {
  bool operator() (miasto_wsk arg1, miasto_wsk arg2) {
    return *arg1 < *arg2; //calls your operator
  }
};

int main() {
  priority_queue<miasto_wsk, vector<miasto_wsk>, MyComparator> q;
  //...
}

3つ目は単なるスタイルです。クラスをmiasto単なる。にするのではなく、直接名前を付けることをお勧めしますtypedef。C++ではより自然です。

于 2012-11-07T12:12:43.067 に答える
3

エラーをもう一度読んでみると、何が問題なのかが正確にわかります。つまり、MI::operator<関数は引数を 2 つではなく 1 つだけ取る必要があるということです。

operator< クラスにある場合(あなたのように)、関数は引数を1つだけ取り、それは比較する他のオブジェクトthisです。独立した関数 (つまり、クラスの一部ではない)operator<として作成する場合、2 つの引数を取る必要があります。

于 2012-11-07T12:05:59.890 に答える
1

比較演算子はメンバー関数であるため、RHS のパラメーターを 1 つだけ取る必要があります。

bool operator<(const MI& rhs) {
      koszt > rhs.koszt;
}

別のオプションは、非メンバー関数として宣言することです。

struct MI {};

bool operator<(const MI& a, const MI& b) {
      return a.koszt > b.koszt;
}
于 2012-11-07T12:07:32.057 に答える
-1

フレンド キーワードを使用して、演算子 < をグローバル スコープに配置します。

typedef struct MI
{
    int nr;
    int koszt;
    friend bool operator<(const MI& a, const MI& b) 
    {
      return a.koszt > b.koszt;
    }
} miasto, *miasto_wsk;
于 2012-11-07T12:07:05.087 に答える