C ++使用对象的优先级队列

时间:2017-04-03 04:01:08

标签: c++ stl queue

我想创建一个对象的优先级队列,特别是(int,int)对。队列应包含分配了优先级的对。

#include <iostream>
#include <queue>

using namespace std;    

class saPair{
public:
    int s;
    int a;
    double priority;
    saPair(int s, int a, double priority){
        this->s = s;
        this->a = a;
        this->priority = priority;
    }
};

// the priority menmber variable determines the priority in the queue
// highest priority pair of (int, int) stays on the top
bool operator< (const saPair& x, const saPair& y) {
    return x.priority < y.priority;
}


int main()
{
    priority_queue<saPair> pq;
    pq.push(saPair(0,0, 0.3));
    pq.push(saPair(0,1, 0.1));
    pq.push(saPair(0,3, 0.5));
    pq.push(saPair(0,3, 5));

    cout << pq.top().a << endl;
    pq.pop();
    cout << pq.top().a << endl;
    pq.pop();
    cout << pq.top().a << endl;


}

如您所见,该对(0,3)具有最高优先级,因此它保持在顶部。但是我的实现问题是,如果我再次以不同的优先级添加(0,3)对,我向队列添加一个新元素,而不是替换已存在的(0,3)对的优先级。

我觉得我为我的要求选择了错误的数据结构。我尝试使用键值来定义一个新的saPair(int,int)类,其操作重载为&lt;运营商。但即使这样似乎也不能正常工作..

有关如何进行的任何建议?或修改

1 个答案:

答案 0 :(得分:1)

您似乎需要对容器进行多键访问:您希望按优先级对其进行排序(或者至少具有优先级的二进制堆,如priority_queue中所示),并且您希望对值为是唯一的,所以你也需要一对值查找。

标准库中没有默认解决方案,但制作自己的文件并不难。

我建议只需存储一个额外的std::set<saPair>来检查该对是否已经在您的容器中。通过这种方式,您可以保持priority_queue的方式,并且不会花费太多精力来实施。

不要忘记将operator<添加到saPair(或将其替换为std::pair),否则std::set将无法使用它。

另一种选择是每次添加时都只需手动检查一对priority_queue。虽然渐近地比std::set解决方案更糟糕,但实际上这可能会更快,并且它将为您节省一些空间。但是,如果你选择std::set,我认为代码会更清晰。

另一个解决方案是boost::multi_index,它允许您轻松构建所需的任何多索引容器。但是,我不认为它会让您利用优先级不需要强排序的事实,因此它不会像{{1}那样拥有线性连续的布局。确实。