0

我查看了这个线程,它讨论了使用这种方法进行比较:

struct thing
{
    int a;
    char b;

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

priority_queue<thing> pq;

另一方面,其他使用方法,例如:

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;

虽然我用第一种方法逻辑自己,但我不理解第二种方法。主要是因为语法。我不确定重载运算符的operator()含义。那个运算符重载是什么?

还有,从cplusplus上的priority_queue看,下面的我也不是很明白,主要是第二个参数。

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

换句话说,我不理解第二种方法及其调用约定。

另外,有什么区别以及首选哪种方法?

4

1 回答 1

1

我不确定重载运算符 operator() 的含义。那个运算符重载是什么?

我们在这里拥有的是函数调用运算符的重载(参见 SO 问题),这意味着客户端代码可以将CompareTime类实例“视为”比较函数:

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

下面我不太明白,主要是第二个参数。

cplusplus参考总结得很好,模板参数:

  • 0 arg - 队列中对象的类型。
  • 1 arg - 队列的底层容器/数据结构,默认为标准向量
  • 2 arg - 对优先级队列的操作依赖于一些优先级比较,即队列中的哪个项目应该在其他项目之前(另请参见Wikipedia,因此此 arg 接受具有比较对象(函子),这意味着普通类的实例重载() 运算符,默认是 std 仿less函数,它只是 '<' 语义(布尔 2 值函数对象)之上的包装器。

// 模板结构少

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); 
    } 
};
于 2013-06-22T19:47:54.780 回答