priority queue question

V

vaclavpich

Hi all,
I want to know your opinion about my implemetaion of priority queue. I
couldn't use std::priority_queue so I've written my. I designed two
kinds of interface but I'm not sure that this is good idea.
Please write me what do you think about this :
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 1) first class is similar to std::priority_queue
template<
class _Ty,
class PriorityQueuePolicy
{
_Container m_c;
public:
// common interface like std::priority_queue
void push(const _Ty& val);
_Ty& top();
void pop();
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 2) this class has only pop and push
template<
class _Ty,
class PushPopPolicy : protected PriorityQueuePolicy<_Ty, _Predicate,
_Container >
{
typedef PriorityQueuePolicy<_Ty, _Predicate, _Container > base;
public:
// common interface like std::priority_queue
void push(const _Ty& val){
base::push(val);
}

_Ty pop(){
if( base::empty()) throw exception;
_Ty val = base::top();
base::pop();
return val;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
template<
class _Ty,
class _Predicate = Less<_Ty>,
class PriorityQueue : public _Policy {};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Thanks
 
A

acehreli

Please write me what do you think about this :
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 1) first class is similar to std::priority_queue
    // common interface like std::priority_queue
    void push(const _Ty& val);
    _Ty& top();
    void pop();};

That interface allows to make those functions strongly exception-safe.
// 2) this class has only pop and push
    void push(const _Ty& val){
    _Ty pop(){
        if( base::empty()) throw exception;
         _Ty val = base::top();
       base::pop();
       return val;
    }};

That interface cannot be made strongly exception-safe because
base::pop() changes the state of the container before the top object
is handed over to the caller.

Then, if the copy constructor of _Ty throws during 'return val;' the
top object is lost. Herb Sutter's book Exceptional C++ and many other
sources cover this. Here is one:

http://www.boost.org/community/exception_safety.html

Ali

P.S. Any name that begins with an underscore followed by a capital
letter is reserved. Ty_ would be a better name.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top