Jack
Jack

Reputation: 271

C++ STL priority_queue with struct Clearification

I have looked over this thread which talks about using this method for comparison:

struct thing
{
    int a;
    char b;

    bool operator<(const thing &o) const
    {
        return a < o.a;
    }
};

priority_queue<thing> pq;

On the other hand other uses method such as this:

struct Time {
    int h; 
    int m; 
    int s;
};

class CompareTime {
    public:
    bool operator()(Time& t1, Time& t2) // Returns true if t1 is earlier than t2
    {
       if (t1.h < t2.h) return true;
       if (t1.h == t2.h && t1.m < t2.m) return true;
       if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
       return false;
    }
} 

priority_queue<Time, vector<Time>, CompareTime> pq;

While I logic myself with the first method, I don't quit understand the second method. Mostly because of the syntax. I am not quit sure what the overloading operator operator() means. What is that operator overloading?

Also, from cplusplus on priority_queue, I don't quite understand the following, mainly the second parameter.

template < class T, class Container = vector<T>,
       class Compare = less<typename Container::value_type> > class priority_queue;

In another word, I don't understand the second method and its calling convention.

Also, what's the difference and which method is preferred?

Upvotes: 0

Views: 149

Answers (1)

Shmil The Cat
Shmil The Cat

Reputation: 4668

I am not quit sure what the overloading operator operator() means. What is that operator overloading?

What we have here is an overloading of the function call operator (see SO question) , this means that client code can 'treat' the CompareTime class instances as compare functions :

CompareTime ct;
if ( ct(t1, t2) ) 
{
...
} 

I don't quite understand the following, mainly the second parameter.

The cplusplus reference summarizes quite well , the template parameters :

  • 0 arg - The type of the objects within the queue.
  • 1 arg - The underlying container/data structure for the queue, by default its the std vector
  • 2 arg - Operation on priority queue relies on some precedence comparison, i.e. which item in the queue should be 'before' other item (see also Wikipedia , so this arg accepts to have compare object (functor) which mean instances of plain class which overload the () operator , the default is the std less functor which is simply a wrapper above the '<' semantics (boolean 2 valued function object).

// TEMPLATE STRUCT less

template<class _Ty>
struct less : public binary_function<_Ty, _Ty, bool>
{   
   // functor for operator<
   bool operator()(const _Ty& _Left, const _Ty& _Right) const 
   {    
         // apply operator< to operands
        return (_Left < _Right); 
    } 
};

Upvotes: 1

Related Questions