当插入大于当前元素的元素时,c ++ priority_queue失去顺序

问题描述

我有std::priotity_queue是使用自定义比较功能实现的。测试时,我遇到了奇怪的行为。我插入第一个元素,然后插入第二个元素,在运行比较后,该元素应该位于第一个元素之前,这确实意味着比较功能可以按预期工作。当插入第三个元素时,该元素现在也应该到达队列的顶部,在std::priority_queue.push()返回之后,而不是看起来像这样的队列:third-second-first;看起来像是:第三秒。

看一下调试器,我看到在运行比较之前,新元素首先添加到队列的末尾。而且由于比较之后第二个添加的元素在队列末尾结束,这意味着第三个添加的元素而不是在第二个插入的元素之前被插入,而是与其交换了。

知道为什么会这样吗?我认为这不是预期的行为。预先感谢!

编辑:这是相关的代码段:

struct Position {
    int turns;
    int cabin;
    int index;

    static bool comparePosition(Position const left,Position const right) {
        if (left.turns != right.turns)
            return left.turns > right.turns;
        else
            return left.cabin > right.cabin;
    }
};


Position order(std::vector<int> const &c,int const n,int const p) {
    std::priority_queue<Position,std::vector<Position>,decltype(&Position::comparePosition)> queue(
            Position::comparePosition);
    int cabina = 1;
    for (int i = 0; i < c.size(); i++) {
        if (cabina <= n) {
            
            queue.push(Position{c[i],cabina,i});
            cabina++;
        } else {
            
            Position out = queue.top();
            cout << out.index + 1 << ' ';
            queue.pop();
            queue.push(Position{c[i],out.cabin,i});

        }

    }
    

    Position out{};
    while (!queue.empty()) {
        out = queue.top();
        queue.pop();
        cout << out.index << ' ';
    }

    
    return out;

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)