我偶然发现了一些奇怪的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文档中读到它,所以我很想获得一些新手程序员易于理解的解释。
干杯!
答案 0 :(得分:3)
priority_queue
类模板的声明:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
除非您还提供了用于保存数据的基础容器,否则您无法提供自定义比较器类型参数。上述行的作者vector
是最佳选择。也可以使用符合要求的任何其他容器,例如, deque
,但vector
证明对大多数应用程序来说是最佳的,因此它是默认值。