如何使用priority_queue的push()?

时间:2015-11-06 05:31:22

标签: c++ priority-queue

这就是我所拥有的

priority_queue<int, vector<string>, std::greater<int>> Jobs1;

如何进行推送()?

vector<string> temp;
// Jobs1.push(what goes in here?) <---- I want to push temp in this min heap, and let's say my compare value is 3

谢谢!

3 个答案:

答案 0 :(得分:1)

正如其他答案所说,priority_queue - 与其他容器类型一样 - 包含特定类型的单个项目。

您的问题和其他评论建议您要存储一堆字符串,按一些任意优先级编号排序。为此,您需要创建自己的类型,包括字符串及其优先级。如果您提供自己的operator<operator>重载,那么标准比较函数也可以使用。

以下是实现此类的一种方法的简单示例,以及如何使用它。这使用C ++ 11功能,例如扩展初始化列表和自动。

#include <iostream>
#include <queue>
#include <string>

class PriorityString
{
public:
        int priority;
        std::string value;

        PriorityString(int _priority, std::string const stringvalue)
        : priority    (_priority)
        , value       (stringvalue)
        {
        }

        bool operator< (PriorityString const& other) const
        {
                return priority < other.priority;
        }

        bool operator> (PriorityString const& other) const
        {
                return priority > other.priority;
        }
};

int
main()
{
        std::priority_queue< PriorityString, std::vector<PriorityString>, std::less<PriorityString> > strings;

        strings.push( {1, "Alice"} );
        strings.push( {2, "Bob"} );
        strings.push( {4, "Charlie"} );
        strings.push( {3, "Dianne"} );

        while (! strings.empty() )
        {
                auto const& ps = strings.top();
                std::cout << "Priority: " << ps.priority << "  V: " << ps.value << std::endl;
                strings.pop();
        }
}

这将输出:

Priority: 4  V: Charlie
Priority: 3  V: Dianne
Priority: 2  V: Bob
Priority: 1  V: Alice

如果您为std::less交换std::greater,那么它们将按优先级的升序打印出来(即较低的优先级将转到队列的前面)。

如果您无法访问C ++ 11功能,可以使用显式构造函数添加项目:

strings.push( PriorityString(1, "Alice") );

strings.top()的返回类型当然是PriorityString的常量引用。

根据您要实现的目标,您可能还需要查看STL的mapset类型及其无序变体。如果您始终希望以固定顺序处理项目,并且在添加新项目时可以容忍(可能)冗长的操作以确定它们在订单中的位置,则此类“PriorityString”设置非常有用。

答案 1 :(得分:0)

底层容器应存储 int ,而非字符串

vector<string>应该是vector<int>

#include <iostream>
#include <queue> 

using namespace std;

int main()
{    
    priority_queue<int, vector<int>, std::greater<int>> Jobs1;
    Jobs1.push(3);
    Jobs1.push(4);
    Jobs1.push(5);
    //..    
}

答案 2 :(得分:0)

push()用于将元素插入优先级队列。因此,要将int插入优先级队列,请使用:

int a = 5;
Jobs1.push(a);

此外,由于您的优先级队列是整数,因此底层容器应该是vector<int>而不是vector<string>