C++11 使用用户定义的对象实现最小优先级队列(C+;+;STL)

C++11 使用用户定义的对象实现最小优先级队列(C+;+;STL),c++11,stl,priority-queue,C++11,Stl,Priority Queue,我正在实现Prims算法。我有一个边向量和它们的权重。 问题是,插入后,队列不会根据边的权重保持递增顺序 相关代码如下所示:- struct weightcomp // To be used solely for priority Queue... { bool operator()(Edge &E1, Edge &E2) { if(E1.weight > E2.weight) return true; } }

我正在实现Prims算法。我有一个边向量和它们的权重。 问题是,插入后,队列不会根据边的权重保持递增顺序

相关代码如下所示:-

struct weightcomp // To be used solely for priority Queue...
{
    bool operator()(Edge &E1, Edge &E2)
    {
        if(E1.weight > E2.weight)
            return true;
    }
};

std::priority_queue<Edge,std::vector<Edge>,weightcomp> PQ; // Priority Queue for Edges

void visit(std::vector<Edge> &PMST, int i) // PMST = Vector of edges and i = name of node
{
    for(auto iter = PMST.begin();iter != PMST.end();++iter)
    {
        if((*iter).u == i || (*iter).v == i)
        {
            PQ.push((*iter));
            (*iter).del = true;  // Mark the vectors elements to be removed.
        }
    }

    PMST.erase(std::remove_if(PMST.begin(),PMST.end(),[](Edge e){ return e.del;}),PMST.end()); // Delete the marked elements
}
struct weightcomp//仅用于优先级队列。。。
{
布尔运算符()(边和E1、边和E2)
{
如果(E1.重量>E2.重量)
返回true;
}
};
std::优先级队列PQ;//边缘的优先级队列
无效访问(std::vector&PMST,int i)//PMST=边的向量,i=节点的名称
{
对于(自动iter=PMST.begin();iter!=PMST.end();++iter)
{
if((*iter.u==i | |)(*iter.v==i)
{
质量推送((*iter));
(*iter).del=true;//标记要删除的向量元素。
}
}
PMST.erase(std::remove_if(PMST.begin(),PMST.end(),[](Edge e){return e.del;}),PMST.end());//删除标记的元素
}

我在实现中缺少了什么?

您有未定义的行为,因为您的比较并不总是返回值。你需要一些类似的东西

bool operator()(const Edge &E1, const Edge &E2) const
{
    return E1.weight > E2.weight;
}

其中,我引用了参数
const
,因为比较不应该修改它们,而操作符
const
,因为它不会改变函子的状态。

weightcomp::operator()
中没有
else
分支,这会导致UB