我尝试为向量和优先级队列制作相同的比较器,但它们给出了相反的结果。为什么会这样呢?
代码:
struct cmp {
bool operator()(int a, int b)
{
return a<b;
}
};
bool compare(int a, int b)
{
return a<b;
}
int main()
{
priority_queue<int,vector<int>, cmp> numbers;
vector<int>v;
v.push_back(1);
v.push_back(20);
v.push_back(7);
sort(v.begin(), v.end(), compare);
numbers.push(1);
numbers.push(20);
numbers.push(7);
cout << "Priority Queue: ";
while(!numbers.empty()) {
cout << numbers.top() << ", ";
numbers.pop();
}
cout << endl;
cout<<"Vector: ";
int i=0;
while(i<v.size()) {
cout << v[i] << ", ";
i++;
}
cout << endl;
return 0;
}
//Output:
Priority Queue: 20, 7, 1,
Vector: 1, 7, 20,
//输出:优先队列:20,7,1,向量:1,7,20,
请澄清歧义。由于
是的,它们反向工作。有关一个可能的参考,请参阅cppreference对std::priority_queue
的描述:
模板参数
[…]
Compare
- A提供严格弱排序的比较类型。注意,Compare形参是这样定义的:如果它的第一个参数以弱顺序出现在第二个参数之前,则返回
true
。但是因为优先级队列首先输出最大的元素,所以"排在"前面的元素实际上是最后输出的。也就是说,队列的前面包含"最后一个"。