【发布时间】:2018-04-29 22:54:41
【问题描述】:
我试图了解比较器如何用于优先级队列,我做了几个测试:
测试1:创建比较器类,并使用priority_queue<T, vector<T>, cmp>
它总是很好用
测试 2:
struct test {
int a = 0;
};
bool operator<(const test& lhs, const test& rhs) {
return lhs.a < rhs.a;
}
int main()
{
priority_queue<test> pq;
}
这按预期工作。
测试 3:将测试 2 放在一个类中
class T{
struct test {
int a = 0;
};
bool operator<(const test& lhs, const test& rhs) {
return lhs.a < rhs.a;
}
};
编译错误:
'bool T::operator<(const T::test&, const T::test&)' must take exactly one argument
似乎编译器认为我为类T重载了运算符
测试 4:重载运算符
struct test {
int a = 0;
bool operator<(const test& rhs) {
return a < rhs.a;
}
};
int main()
{
vector<test> v;
sort(v.begin(), v.end()); // No error
set<test> s; // No error
priority_queue<test> pq; // Compiling error
}
只有priority_queue会报错:
'passing 'const test*' as 'this' argument discards qualifiers'
我不知道为什么这适用于排序和设置,但不适用于优先级队列。
【问题讨论】:
-
您将
operator<设为T的方法。要么在T::test内声明为好友,要么完全在T外声明。 -
4: stackoverflow.com/questions/550428/… ,比较不应该改变被比较的对象。
-
第二个问题的答案是,如果运算符不会更改 lhs(它不是),则它应该是 const 限定的。在
{之前粘贴const。请每个问题问一个问题。
标签: c++ comparator priority-queue