我正在为大学项目创建A *的线程安全版本,并遇到这个奇怪的问题,其中优先级队列的这两个实现产生不同的结果。我已经盯着这一段时间了,我开始忽视实际的项目工作。有人能发现这两种实现之间的区别吗?
template<typename T, typename priority_t>
struct PriorityQueue
{
typedef pair<priority_t, T> PQElement;
class Compare
{
public:
bool operator() (PQElement e1, PQElement e2)
{
return e2.first < e1.first;
}
};
priority_queue<PQElement, vector<PQElement>,
Compare> elements;
inline bool empty() const { return elements.empty(); }
inline void put(T item, priority_t priority) {
elements.emplace(priority, item);
}
inline T get() {
T best_item = elements.top().second;
elements.pop();
return best_item;
}
};
第二个实现
template<typename T, typename priorityT>
struct PriorityQueue {
typedef pair<priorityT, T> PQElement;
vector<PQElement> elements;
inline bool empty() const { return elements.empty(); }
inline void put(T item, priorityT priority)
{
elements.push_back(PQElement(priority, item));
std::sort(elements.begin(), elements.end(), [&](PQElement e1, PQElement e2) { return e2.first < e1.first; });
}
inline T get() {
PQElement bestItem = elements.back();
elements.pop_back();
return bestItem.second;
}
};
请注意,我对这两个实现的幕后内容不感兴趣,除非它与我用来与它们交互的函数产生的输出变化有关。
答案 0 :(得分:0)
原因是,std::priority_queue
以与std::vector
不同的顺序返回相同优先级的元素。我发现在发现答案之后这可能是一个愚蠢的问题,但是接收相同优先级元素的顺序会影响我算法的效率。对不起,我觉得有人可能会觉得这个问题很有趣。