这就是我所拥有的
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
谢谢!
答案 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的map
和set
类型及其无序变体。如果您始终希望以固定顺序处理项目,并且在添加新项目时可以容忍(可能)冗长的操作以确定它们在订单中的位置,则此类“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>