自定义比较函数用于优先级结构指针

时间:2015-12-01 20:11:12

标签: c++ struct priority-queue

我有一个priority_queue的结构指针,我想得到一些"活跃的"最少" val"值。这是我发现的,但它并不关心节点'活动,但只给予元素最小值。

#include<bits/stdc++.h>
using namespace std;


struct node{
    long long val;
    bool active;
};

struct Compare
{
    bool operator()(const node *a,const node *b)const
    {
        if(a->active == b->active)
            return (a->val) > (b->val);
        if(a->active)
            return 1;
        return 0;
    }
};

typedef priority_queue<node*, vector<node*> ,Compare > PQ;

int main()
{
    PQ q;
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin >> x;
        node* nd=new node;
        nd->val = x;
        nd->active = 1;
        q.push(nd);
    }
    node* first =q.top();
    cout << "the top element is " << (first->val) << endl;
    q.pop();
    first->active = 0;
    q.push(first);
    node* second = q.top();
    cout << "the next top element is " << (second->val) << endl;
    cout << "the activity state of the second element is " << (second->active) << endl;
    return 0;
}

更新:代码现在正常运行,并且关心节点&#39;活性

2 个答案:

答案 0 :(得分:1)

添加后,priority_queue中的元素无法修改。如果你想这样做,你需要pop关闭值,修改它,然后重新push

答案 1 :(得分:0)

.where('LOWER(name) LIKE LOWER(?)', "%#{agency_name}%") 一起使用的比较函数需要定义strict weak order。您的排序函数没有定义严格的弱顺序:如果对象std::priority_queue<...>处于非活动状态(即xactive),您有false但条件为Compare()(x, x) == true (使用关系符号:Compare()(x, x) == false,即!(x < x) == true不小于x)必须持有。

当不满足比较函数的约束时,x的行为未定义。