[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

priority queue question

vaclavpich

10/28/2008 7:20:00 PM

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 _Predicate = Less<_Ty>, // comparator
class _Container = Array<_Ty> // like std::vector
>
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 _Predicate = Less<_Ty>, // comparator
class _Container = Array<_Ty> // like std::vector
>
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 _Container = Array<_Ty>
class _Policy = PriorityQueuePolicy<_Ty, _Predicate, _Container >
>
class PriorityQueue : public _Policy {};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Thanks




1 Answer

acehreli

10/29/2008 5:41:00 AM

0

On Oct 28, 12:19 pm, vaclavp...@atlas.cz wrote:

> 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_s...

Ali

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