题
继续 列表到优先队列
我正在通过随机访问实现改进的Priority_queue。
template <class T, class Container = std::vector<T> >
class Heap {
public:
Heap() {}
Heap(const Container& container) {
container_ = container;
std::make_heap(container_.begin(), container_.end());
}
Heap<T, Container>& operator=(const Heap<T, Container>& heap) {
if (this != &heap)
container_ = heap.container_;
return *this;
}
void push(const T& x) {
container_.push_back(x);
std::push_heap(container_.begin(), container_.end());
}
void pop() {
std::pop_heap(container_.begin(), container_.end());
container_.pop_back();
}
const T& top() {
return container_.front();
}
const Container& getContainer() const {
return container_;
}
T& operator[](size_t n) {
return container_[n];
}
typename Container::const_iterator begin() const {
return container_.begin();
}
typename Container::const_iterator end() const {
return container_.end();
}
size_t size() const {
return container_.size();
}
T& base() {
return container_.back();
}
Container::iterator erase(Container::iterator position) {
return container_.erase(position);
}
private:
Container container_;
};
我走正确的方法吗?
- 修复了一般的构造函数。
- 改进的代码。
解决方案
对我来说看起来不太好:
- 一般的构造函数应通过const参考进行论证。
- 任务操作员没有检查自我分配。
- 这
getContainer()
方法显示界面中缺乏清晰度 - 为什么您只是简单地公开这样的实现细节? - 最重要的是:为什么要“随机访问优先队列”?
其他提示
您的pop()方法可以违反堆顺序。使用pop_heap()代替pop_back()。我似乎现在找不到其他错误。
您可以通过推动随机整数并逐一来轻松测试这种实现。您应该以分类顺序使它们恢复。这被称为堆排序。
建议:
您可以将RED返回到容器中,而是可以将常量迭代器实现为此类。
请注意,您不应更改随机访问的元素的键,因为它可能会破坏堆结构。如果您需要这样的功能,则应实现Change_key函数,该功能将安全更改密钥并维护堆顺序。
不隶属于 StackOverflow