我知道有类似的线程,但花了一个小时试图强迫我的程序工作后,我决定寻求帮助。 首先。我以为我很熟悉c ++,因为我尝试了一些非常简单的PHP(我最熟悉的编程语言),但在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();
}
答案 0 :(得分:6)
这里有很多问题。
在类中定义运算符时,它会自动将类类型的参数作为其第一个参数,并且不能为其创建参数。所以你要么将运算符保留在类中,如下所示:
struct MI {
bool operator< (const MI&);
};
或宣布经营者是独立的:
struct MI {
//...
};
bool operator< (const MI&, const MI&);
其次,您的priority_queue
存储指向MI
的指针,而非MI
的实例,因此无论如何都不会调用运算符。在定义优先级队列时必须提供比较器,如下所示( EDITED ):
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 ++中更自然。
答案 1 :(得分:3)
错误,如果你再次阅读它,会告诉你到底出了什么问题:MI::operator<
函数只应该只有一个参数而不是两个。
如果您在类中有operator<
(就像您一样),那么该函数只需要一个参数,而这是另一个要与this
进行比较的对象。如果您将operator<
创建为独立式函数(即不属于该类),则必须采用两个参数。
答案 2 :(得分: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;
}
答案 3 :(得分:-1)
使用friend关键字放置运算符&lt;在全球范围内
typedef struct MI
{
int nr;
int koszt;
friend bool operator<(const MI& a, const MI& b)
{
return a.koszt > b.koszt;
}
} miasto, *miasto_wsk;