C++ 优先级队列无法与compare()配合使用
我设计了一个优先级队列,但它不适用于某些测试用例C++ 优先级队列无法与compare()配合使用,c++,algorithm,data-structures,heap,priority-queue,C++,Algorithm,Data Structures,Heap,Priority Queue,我设计了一个优先级队列,但它不适用于某些测试用例 #include <iostream> #include <algorithm> #include <vector> using namespace std; template <class T1, class T2> class priorityQueue { private: vector<T1> dataContainer; class Compare {
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template <class T1, class T2>
class priorityQueue {
private:
vector<T1> dataContainer;
class Compare {
public:
// Compare two elements .
bool operator()(const T1& a, const T1& b) const {
return a > b;
}
};
public:
priorityQueue(vector<T1>& myV) : dataContainer(myV) {
make_heap(dataContainer.begin(), dataContainer.end(), Compare());
}
bool empty() const { return dataContainer.empty(); }
// get the size of the queue
size_t size() const { return dataContainer.size(); }
// get the element with the highest priority in the queue
T1& top(){ return dataContainer.front();}
// push an element into the qeueu
void enQueue(T1& element) {
dataContainer.push_back(element);
push_heap(dataContainer.begin(), dataContainer.end(), Compare());
}
// pop the element with the highest priority in the qeueu
void deQueue() {
pop_heap(dataContainer.begin(), dataContainer.end(), Compare());
dataContainer.erase(dataContainer.begin());
}
void printQ() {
typename vector<T1>::iterator itr ;
cout << "the priorityQueue is : " << endl ;
for (itr = dataContainer.begin(); itr != dataContainer.end(); ++itr) {
cout << *itr << "\t";
}
cout << endl ;
}
};
int main() {
vector<int> aa;
int a[4] = {5, 8, 3, 2};
aa.assign(a, a+4);
priorityQueue<int, bool> myQ(aa);
myQ.printQ();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
模板
类优先级队列{
私人:
矢量数据容器;
班级比较{
公众:
//比较两个元素。
布尔运算符()(常数T1&a,常数T1&b)常数{
返回a>b;
}
};
公众:
优先级队列(vector&myV):数据容器(myV){
生成堆(dataContainer.begin(),dataContainer.end(),Compare());
}
bool empty()常量{return dataContainer.empty();}
//获取队列的大小
size_t size()常量{return dataContainer.size();}
//获取队列中优先级最高的元素
T1&top(){return dataContainer.front();}
//将一个元素推入QUEU
无效排队(T1和元素){
数据容器。推回(元素);
push_堆(dataContainer.begin()、dataContainer.end()、Compare());
}
//弹出QUEU中优先级最高的元素
无效出列(){
pop_堆(dataContainer.begin()、dataContainer.end()、Compare());
擦除(dataContainer.begin());
}
void printQ(){
类型名向量::迭代器itr;
cout在dequeue()
操作中,必须删除最后一个元素:
实际输出是什么?在问题中使用“ab”,是哪一个?对不起,这是一个打字错误,应该是a>b,输出是2 5 3 8。它可以在linux上运行,应该是8 5 3 2。谢谢。@user100228如果你解决了一个问题,不要删除整个问题并用“我解决了它,谢谢”这样的文本替换它。这里的问题和答案不仅用于解决您的特定问题,而且也适用于后来出现并可能希望向他们学习的人。从空问题中学习是不可能的;我已恢复为包含您的代码。如果问题已解决,请接受帮助您解决问题的人的答案,或者提供您自己的答案回答并接受这个问题……所以请选择其中一个。@user1002288您又做了一次(!),我建议您第三次不要这样做。如果您想删除问题,可以单击“删除”这是一个删除它的投票…投票通过与否取决于适度。请注意,能够回顾问题历史并没有什么特别的——就像维基百科一样,除非你经历了删除过程,否则一切都在那里。你(或其他人)也可以看到历史:如果问题已经解决,那么请接受答案;如果提供的答案之一不是解决问题的答案,那么请写一个答案,详细说明问题是如何解决的,然后接受。在pop_heap()之后,最高优先级的元素是向量的第一个元素,因此应该删除第一个。@user1002288:这是错误的(请参见25.4.6.2)。在pop_heap()
之前,最大的元素在前面,但函数的全部目的是将其移到后面。@user1002288:改为使用std::greater()
尝试(看起来你就是这么做的)。
void deQueue()
{
pop_heap(dataContainer.begin(), dataContainer.end(), Compare());
dataContainer.pop_back();
}