【问题标题】:Modified comparator for priority_queue of C++ not working properlyC++的priority_queue的修改比较器不能正常工作
【发布时间】:2017-04-02 16:18:20
【问题描述】:

在下面给出的代码中,我试图将priority_queue 中的一些值按照它们的键值进行排序,这些键值存储在“键”向量中。然后,我正在更改键值以查看比较器是否正常工作。在这里,当我将 key[8] 更改为 10 时,值 8 会正确更改其在队列中的位置。但是当我将 key[2] 更改为 -1 时,它改变了它在队列中的位置,但不正确。它应该位于队列的顶部,因为它的键值是最小的,但事实并非如此。

我写比较器代码的方式有错吗?或者,我做错了什么?

如果我想根据键值对值进行升序排序,我想知道修改优先级队列比较器的正确方法。

#include <bits/stdc++.h>
using namespace std;
vector <int> key(1000);
struct comp{
    bool operator()(int a,int b)const{
        return key[a]>key[b];
    }
};
int main()
{
    priority_queue <int,vector<int>,comp> q,temp;
    for(int a=0;a<10;a++){
        int n=rand()%16;
        key[a]=n;
        q.push(a);
    }
    while(!q.empty()){
        temp=q;
        while(!temp.empty()){
            cout<< temp.top() << "(" << key[temp.top()] << ") ";
            temp.pop();
        }
        cout<<endl<<endl;
        int u,v;
        cin>> u >> v;
        key[u]=v;
    }
    return 0;
}

【问题讨论】:

  • 你从哪里养成了可怕的#include &lt;bits/stdc++.h&gt; 习惯?这是一个严肃的问题。直到大约一年前,初学者才这样做。
  • 在提问时最好不要在图片中包含代码。
  • 有什么问题吗?我实际上用它来节省编程比赛的时间。 @Hackl
  • Why should I not #include <bits/stdc++.h>?Why is “using namespace std” considered bad practice?。它们一起使用时,几乎将整个标准库放入全局命名空间中。这意味着突然之间在全局命名空间中有很多名称非常常见的标识符,它们可能会与程序的标识符发生冲突并替换它们。
  • @user4581301:如果您真的打算雇用一个完整的初学者来培训他或她的工作,这只是一个问题。如果您正在寻找高级开发人员,我认为使用这样的过滤器没有任何问题。审核工作申请需要时间和金钱。

标签: c++ c++11 priority-queue comparator


【解决方案1】:

你从未改变过q。您在temp 中复制了q,但从未对q 做过任何事情。

【讨论】:

  • 我正在更改循环中 q 元素的键值,然后再次将 q 复制到 temp 中。它发生在循环中。
  • 当你在外面改变key时,队列不会再自行排序了。
【解决方案2】:

意图和代码足够合理,但问题更为根本。问题是std::priority_queue 不支持开箱即用的减键操作。

为了执行此类操作,您需要手动维护密钥列表并从&lt;algorithm&gt; 调用std::make_heapstd::push_heap

请参阅此以获得更详细的答案:https://stackoverflow.com/a/9210662/1045285

作为旁注,请考虑包括:

#include <priority_queue>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2016-05-13
    • 2021-12-21
    相关资源
    最近更新 更多