7

我知道有类似的线程,但是在花了一个小时试图强制我的程序工作之后,我决定寻求帮助。首先。我认为我对 c++ 非常了解,因为我尝试了一些在 PHP 中非常简单的东西(我最了解的编程语言)但在 c++ 中非常复杂(至少对我来说非常复杂)。所以我想创建结构指针的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’

问题是什么?也许我应该使用结构的副本而不是指向结构的指针?

编辑2

此代码不会产生任何编译错误:

#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存储指向 的指针MI,而不是 的实例MI,因此无论如何都不会调用运算符。定义优先级队列时必须提供比较器,如下所示(已编辑):

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;
  //...
}

第三只是样式问题:我建议您直接命名该类,miasto而不是仅将其命名为typedef. 在 C++ 中它更自然。

于 2012-11-07T12:12:43.067 回答
3

如果你再读一遍,这个错误会告诉你究竟出了什么问题:该MI::operator<函数应该只接受一个参数而不是两个。

如果您operator< 类中有(就像您一样),那么该函数只接受一个参数,那就是要与之比较的另一个对象this。如果你创建operator<为一个独立的函数(即不是类的一部分),那么它必须有两个参数。

于 2012-11-07T12:05:59.890 回答
1

您的比较运算符是一个成员函数,因此对于 RHS,它应该只接受一个参数:

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

使用friend关键字将运算符<放在全局范围内

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 回答