C++ std::priority_队列比较和队列元素的年龄

C++ std::priority_队列比较和队列元素的年龄,c++,priority-queue,C++,Priority Queue,从这里开始 在编写比较函数时,是否有任何方法可以判断哪个元素在队列中等待的时间更长 假设每当插入新元素时调用compare函数,“a”将始终是新项,“b”将始终是队列中已存在的元素吗?还是工作方式不同 我的想法是这样的: bool my_class::operator()(const my_class &a, const my_class &b) { //Lower priority comes first return (a.get_priority() <

从这里开始

在编写比较函数时,是否有任何方法可以判断哪个元素在队列中等待的时间更长

假设每当插入新元素时调用compare函数,“a”将始终是新项,“b”将始终是队列中已存在的元素吗?还是工作方式不同

我的想法是这样的:

bool my_class::operator()(const my_class &a, const my_class &b) {
    //Lower priority comes first
    return (a.get_priority() < b.get_priority());
}
static unsigned long count = 0;
std::priority_queue<std::pair<my_class,unsigned long>> queue;
bool my_class::operator()(const my_class&a,const my_class&b){
//低优先级优先
返回(a.get_priority()
当“a”和“b”的优先级相同时,则“b”被赋予优先级,因为它在队列中的时间更长


感谢您对std::queue如何工作以及我如何实现目标的任何反馈。

为对象保留一个时间戳,并在对象插入队列时进行设置。然后将该时间戳作为比较条件的一部分

假设每当插入新元素时调用compare函数,“a”将始终是新项,“b”将始终是队列中已存在的元素吗?还是工作方式不同

正如Dietmar Kühl在下文中指出的那样,当谓词是参数的顺序与插入元素的顺序有任何关系时,没有任何保证

当“a”和“b”的优先级相同时,则“b”被赋予优先级,因为它在队列中的时间更长

使用类似以下内容:

bool my_class::operator()(const my_class &a, const my_class &b) {
    //Lower priority comes first
    return (a.get_priority() < b.get_priority());
}
static unsigned long count = 0;
std::priority_queue<std::pair<my_class,unsigned long>> queue;
现在,
count
可以用作“时间戳”,因此只需在
compare
函数中执行此操作即可

class MyComparator{
public:  
  bool operator()(const std::pair<my_class,unsigned long>& a, const std::pair<my_class,unsigned long>& b)  const
    {
       if (a.first == b.first)
          return a.second < b.second;
       return a.first < b.first;
    }
};

当谓词为参数的顺序与插入元素的顺序有任何关系时,无法保证!要根据元素插入优先级队列的时间对其进行排序,您需要添加一个“时间戳”(即计数器)。@DietmarKühl谢谢,我会注意到!我并不特别喜欢用大整数来填充队列以减少运行时溢出的更改,但感谢您提出了这个概念。我想可能有一些特定于我的项目的逻辑,我可以用它来代替计数器。
#include <queue>
#include <utility>
#include <vector>
#include <iostream>


class MyComparator{
    public:
      bool operator()(const std::pair<int,unsigned long>& a, const std::pair<int,unsigned long>& b)
        {
           if (a.first == b.first)
              return b.second  < a.second;
           return a.first < b.first;
        }
    };

unsigned long count = 0;
int main()
{
        std::priority_queue<std::pair<int,unsigned long>, std::vector<std::pair<int, unsigned long> >, MyComparator> queue;

        queue.push(std::make_pair(4, count++));
        queue.push(std::make_pair(4, count++));
        queue.push(std::make_pair(5, count++));
        queue.push(std::make_pair(3, count++));

        while(queue.size() > 0)
        {
                std::cout << "[" << queue.top().first << ", " << queue.top().second << "]" << std::endl;
                queue.pop();
        }

        return 0;

}
[5, 2]
[4, 0]
[4, 1]
[3, 3]