Implementing a priority queue that can be iterated over in C++

拈花ヽ惹草 提交于 2019-12-04 13:07:57

问题


I need to implement a priority queue for a project, but the STL's priority_queue is not indicated since we need to iterate over all elements and remove them randomly.

We are thinking about using the STL's set for this, wrapping it in a class to make it an ADT.

Is there a smarter solution for this?

How can we make it so some of set's public member functions can be used publicly? We're interested in iterators, etc.

Apparently deriving the STL is unwise because of the lack of virtual destructors :/


New code:

#ifndef PRIORITYQUEUE_H_
#define PRIORITYQUEUE_H_

#include <set>

template<typename T, template<typename X> class impl_type = std::set>
class PriorityQueue {
    typedef impl_type<T> set_type;
    typedef typename set_type::iterator iterator;
public:
    void push(const T& x) {
        insert(x);

    }

    void pop() {
        erase(begin());
    }

    const T& top() const {
        return *begin();
    }
};

#endif /* PRIORITYQUEUE_H_ */

So, we currently have this. The compiler doesn't complain about insert, but it does complain about erase(begin()) and return *begin():

there are no arguments to 'begin' that depend on a template parameter, so a declaration of 'begin' must be available

Why is this?


回答1:


You should be able to implement your own priority queue using std::vector, std::make_heap, std::push_heap, and std::pop_heap. Isn't this how std::priority_queue is implemented? You'll just need to call std::make_heap again to fix the data structure when you remove a random element.

Do you need to iterate over the elements in order? There's a std::sort_heap algorithm to order the underlying std::vector.




回答2:


Do you really need a priority queue ?

You need iterate over all items and remove randomly -> linked list

If you need to keep the list sorted, sort it at the beginning and then, when inserting new item, use insertion sort (insert new item on right place).




回答3:


STL's set should be usable to make what you want, although I must note that the list of requirements looks a little strange. You could just define a new type.

template<typename T, template<typename X> class impl_type = std::set> class prio_queue {
    typedef impl_type<T> set_type;
    typedef typename set_type::iterator iterator;
    // etc
public:
    // Forward the set's members
    T& top() {
        return *begin();
    }
    // etc
};



回答4:


I would follow the example set by some of the other container adapters in the standard library use composition and make the type of the underlying container a template parameter. Though since it is a school project that might be too much flexibility. You might start by using composition with one of the existing Containers and build from there if necessary.



来源:https://stackoverflow.com/questions/4421506/implementing-a-priority-queue-that-can-be-iterated-over-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!