Priority_queue仿函数使用C ++

时间:2014-10-17 19:46:31

标签: c++ functor

我偶然发现了一些奇怪的priority_queue用法,我很想得到一些正确的解释,为什么在priority_queue声明中使用这样的东西是可行的/有效的:

typedef priority_queue<RandomContainer, **vector<RandomContainer>**, FunctorName> NewQueueName; 

假设我们有一些叫做SPerson的结构:

struct SPerson
{ 
   int age; 
   string name; 
   string surname; 
}; 

和一些函数,它将有助于根据我们的喜好对队列的所有元素进行排序:

struct TheWayILike
{ 
   bool operator()(const SPerson &name1, const SPerson &name2) 
   { 
      if(name1.name > name2.name) return true; 
      if(name1.name < name2.name) return false; 

      return false; 
    } 
}; 

现在我们可以声明我们的priority_queue,它将基于结构中的元素,并将由名为TheWayILike的仿函数排序。

priority_queue<SPerson, TheWayILike> 

或更短的方式使用typedef和单一名称,如:

 typedef priority_queue<SPerson, TheyWayILike> newNameForPQ;  

但不知何故,这是错误的,我必须添加以下行:vector

问题:

为什么我必须将我个人定制的数据类型压缩为矢量?

为什么它必须是一个向量,为什么我还应该使用它?

为什么我需要将数据填入矢量?我还没有在官方的priority_queue文档中读到它,所以我很想获得一些新手程序员易于理解的解释。

干杯!

1 个答案:

答案 0 :(得分:3)

你没有&#39;不得不。但请查看priority_queue类模板的声明:

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

除非您还提供了用于保存数据的基础容器,否则您无法提供自定义比较器类型参数。上述行的作者vector是最佳选择。也可以使用符合要求的任何其他容器,例如, deque,但vector证明对大多数应用程序来说是最佳的,因此它是默认值。