如何配置 std::priority_queue 以忽略重复项?

发布于 2024-11-06 10:02:49 字数 192 浏览 5 评论 0原文

如何配置 std::priority_queue 来忽略重复项?

当我添加一个已包含的密钥时,应该忽略这个新密钥。 (就我而言,旧的和新的优先级将始终完全相同。)

从复杂性角度来看,它不应该有什么区别:它将尝试插入到适当的位置,找到现有的位置,并且不执行任何操作。问题只是 std::priority_queue 是否可以以这种方式配置。

How can I configure std::priority_queue to ignore duplicates?

When I add a key that is already contained then this new one should be ignored. (In my case, the priority for the old and the new one will always be exactly the same.)

Complexity-wise it should not make a difference: It will try to insert at the appropriate location, find the existing one there and do nothing. The question is just if std::priority_queue is configurable in that way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

走过海棠暮 2024-11-13 10:02:49

您可以从 STL 集中实现priority_queue。

实现可迭代的优先级队列C++

You can implement a priority_queue out of an STL set.

Implementing a priority queue that can be iterated over in C++

韬韬不绝 2024-11-13 10:02:49

正如 Aater 提到的,您可以使用 stl 集作为优先级队列。

另一种选择是将重复项添加到优先级队列中,但是当从队列中弹出项目时,请跟踪先前的值并忽略重复的值。例如,这里处理优先级队列上的所有值,同时忽略重复项

    priority_queue<int> pq = /* values */;
    
    int curr = 0;
    int prev = 0;
    bool first = true;
    while(isplit < target) {
        prev = curr;
        curr = pq.top();
        pq.pop();
        if (!first && prev == curr) {
            continue;
        }
        first = false;
        // do something with curr
    }

As Aater mentioned you could use an stl set as a priority queue.

Another option is to add duplicates to the priority queue, but when popping items off the queue, keep track of the previous value and ignore repeated values. For example, here's processing all values on a priority queue while ignoring duplicates

    priority_queue<int> pq = /* values */;
    
    int curr = 0;
    int prev = 0;
    bool first = true;
    while(isplit < target) {
        prev = curr;
        curr = pq.top();
        pq.pop();
        if (!first && prev == curr) {
            continue;
        }
        first = false;
        // do something with curr
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文