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();
 }