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

时间:2015-04-29 08:49:47

标签: 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;
    }
};

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
}

我在实施中缺少什么?

1 个答案:

答案 0 :(得分:0)

您有未定义的行为,因为您的比较并不总是返回值。

需要一些东西
bool operator()(const Edge &E1, const Edge &E2) const
{
    return E1.weight > E2.weight;
}

我在参数const引用的位置因为比较不应该修改它们,而操作符const因为它不会改变仿函数的状态。