我正在尝试使用存储每个元素的向量来构建优先级队列。首先,我想将元素插入到具有优先级的向量中。我不确定是否有可能,如果没有,有人可以给我另一个解决方案。 这是我的代码:
template <typename E>
class PriorityQueue {
private:
std::vector<E> elements;
E value;
int pr;
public:
PriorityQueue() {}
void insert(int priority, E element) {
}
};
答案 0 :(得分:2)
执行此操作的标准算法(请参阅Introduction To Algorithms第6章)如下:
推动项目时,将其插入向量的末尾,然后将其“气泡”到正确的位置。
弹出最小的项目时,将第一项(位置0)替换为末尾的项目,然后将其“气泡”到正确的位置。
可以证明这可以通过(摊销的)对数时间来完成(摊销是由于向量可能会使自身加倍)。
但是,没有必要自己实现,因为标准库包含std::priority_queue
,它是使用std::vector
作为其默认序列容器的容器适配器。例如,如果您定义
std::priority_queue<int> q;
然后q
将成为适应向量的优先级队列。
答案 1 :(得分:2)
以下是如何为vector创建优先级元素:
struct PriElement
{
int data;
int pri;
bool operator < ( const PriElement & other ) const
{
return pri < other.pri;
}
};
vector<PriElement> _vector;
然而,真正的问题是保持向量按优先级排序。
这是一个天真的实现,显示了冒泡方法:
class PriorityQueue{
public:
void insert( int data, int pri )
{
_vector.push_back(PriElement(data,pri));
int index = _vector.size() -1;
while ( ( index > 0 )&& (_vector[index] < _vector[index-1] ) )
{
swap(_vector[index],_vector[index-1]);
index--;
}
}
private:
vector<PriElement> _vector;
};
对于任何现实世界的实现,如上所述,请使用priority_queue。