当前位置: 首页 > 知识库问答 >
问题:

如何在不遍历优先级队列的情况下获取该队列的最后一个元素

袁桐
2023-03-14

我有以下优先级队列:

#include <iostream>
#include <queue>
#include <iomanip>

using namespace std;

struct Time {
    int h; // >= 0
    int m; // 0-59
    int s; // 0-59
};

class CompareTime {
public:
    bool operator()(Time& t1, Time& t2)
    {
       if (t1.h < t2.h) return true;
       if (t1.h == t2.h && t1.m < t2.m) return true;
       if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
       return false;
    }
};

int main()
{
    priority_queue<Time, vector<Time>, CompareTime> pq;

    // Array of 4 time objects:

    Time t[4] = { {3, 2, 40}, {3, 2, 26}, {5, 16, 13}, {5, 14, 20}};

    for (int i = 0; i < 4; ++i)
       pq.push(t[i]);
    while (! pq.empty()) {
       Time t2 = pq.top();
       cout << setw(3) << t2.h << " " << setw(3) << t2.m << " " <<
       setw(3) << t2.s << endl;
       pq.pop();
    }

    return 0;
}

现在为了得到最后一个元素,我必须pop()队列中的所有元素。是否有某种方法可以检索这个优先级队列的最后一个元素。

我知道可以颠倒“CompareTime”中的顺序,使最后一个元素成为第一个元素。我不想这样做,因为我想按“CompareTime”确定的顺序从优先级队列中弹出()元素。但同时我还需要优先级队列的最后一个元素。。不弹出优先级队列中的所有元素。是否可以确定优先级队列的最后一个元素的值。

我正在使用以下gcc编译器:gcc(Ubuntu/Linaro 4.6.4-6ubuntu2)4.6.4

共有2个答案

巫健柏
2023-03-14

您可以将值存储为某个大值-实际值,然后在检索时执行相同的操作,即大值-队列(顶部)值。e、 例如,大值=100,然后将56存储为44 20存储为80。。。当检索到80时,表示为100-80=20

这就是如何以相反的优先级顺序填充队列;)

仲阳朔
2023-03-14

d::priority_queue不支持你想直接做什么。请参考:http://www.cplusplus.com/reference/queue/priority_queue/

当然,您总是可以创建自己的DS,但是有一些库容器可以做您需要的事情。

编辑:

你可以考虑使用

std::set 

http://en.cppreference.com/w/cpp/container/set

它是有序的,您可以快速访问第一个和最后一个元素,还可以快速删除任何元素。请注意,元素必须是唯一的。如果你不想,你可以用

std::multiset 

哪个更灵活,能做到这一点。

在两端都有元素

std::set::begin
std::set::rbegin

迭代器是可用的。由于集合一直在排序,因此这些元素是最小和最大元素。

希望有帮助!

 类似资料:
  • 基本上,我已经得到了一个CircularQueue的实现,我需要实现一个名为'public boolean contains(E other)'的方法,如果参数'other'存在于我的队列中,该方法应该返回true。 我对它没意见,因为它是一个数组,但后来我看到了它的另一个条件,这困扰着我。 请记住,您不能在队列中的所有元素之间自由导航。只有front元素在任何时候都可以通过peek方法访问。co

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 问题内容: 简而言之,我正在实现一个图形,现在正在研究Kruskal,我需要一个优先级队列。我对优先级队列的定义是,具有最小密钥的元素将排在最前面?错了吗 因为当我在队列中插入加权边(或数字)时,它们不会最终排序。 那会打印出来;[1、54、51、102、99、55]。这不是我希望他们成为的那样!是的,我制作了一个进入优先级队列的编译器,该队列从边缘对象中提取数字并根据该int进行比较。因此,这应

  • 我定义最大优先级队列如下: 我需要理解这是如何工作的,特别是当1只得到2的索引(而不是4)时? 多谢了。

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 问题 怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0