这两个优先级队列包装器有什么区别
What is the difference between these two priority queue wrappers?
我正在为大学项目创建一个* 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;
}
};
请注意,我对这两个实现的幕后发生的事情不感兴趣,除非它与我用于与它们接口的功能产生的输出更改相关。
因此,原因是,std::priority_queue
以不同顺序与std::vector
返回相同优先级的元素。我意识到,发现答案后可能是一个愚蠢的问题,但是收到相同优先级要素的顺序影响了我的算法的效率。抱歉,我认为有人可能会发现这个问题很有趣。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 将此私有删除器函数包装在结构中的目的是什么?
- 有什么方法可以包装自动类型扣除的助推"tee"流的构造?
- 我的基于可变模板的包装器函数有什么问题?
- Opencl C API包装器中的clfinish等效是什么
- 为对象创建"thin"结构包装器的正确方法是什么?
- 这两个优先级队列包装器有什么区别
- 用SWIG包装对象从C++调用Python函数的最干净方法是什么
- 与std::mutex相比,其他mutex包装库的优势是什么
- realloc C 函数的可能包装函数有什么错误?
- 使用 C++11 接口包装 C 回调的最佳方法是什么?
- 为我的向量包装器和迭代器返回'begin'和'end'函数返回什么?
- 轻量级包装器-这是一个常见问题吗?如果是,它的名称是什么
- 运算符重载 - 在 char 数组包装类中实现 C++ setter 的正确方法是什么
- 如何为delete编写一个C包装器,既快速又释放给定的任何类型,而不告诉它是什么类型
- 在自定义迭代器中包装STL容器的最佳方法是什么?