Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优先级队列函子使用C++;_C++_Functor - Fatal编程技术网

C++ 优先级队列函子使用C++;

C++ 优先级队列函子使用C++;,c++,functor,C++,Functor,我偶然发现了优先级队列的一些奇怪用法,我想得到一些正确的解释,说明为什么在优先级队列声明中使用这样的东西是合理/有效的: typedef priority_queue<RandomContainer, **vector<RandomContainer>**, FunctorName> NewQueueName; 以及一些有助于根据我们的喜好对队列的所有元素进行排序的函子: struct TheWayILike { bool operator()(const S

我偶然发现了优先级队列的一些奇怪用法,我想得到一些正确的解释,说明为什么在优先级队列声明中使用这样的东西是合理/有效的:

typedef priority_queue<RandomContainer, **vector<RandomContainer>**, FunctorName> NewQueueName; 
以及一些有助于根据我们的喜好对队列的所有元素进行排序的函子:

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; 
    } 
}; 
struct thewaylike
{ 
布尔运算符()(常量SPerson&name1,常量SPerson&name2)
{ 
如果(name1.name>name2.name)返回true;
if(name1.name
现在我们可以声明优先级队列,它将基于结构中的元素,并由名为Wayilike的函子排序

priority_queue<SPerson, TheWayILike> 
优先级队列
或使用typedef和单名的较短方式,如下所示:

 typedef priority_queue<SPerson, TheyWayILike> newNameForPQ;  
typedef priority\u队列newNameForPQ;
但不知怎的,这是错误的,我必须加上以下几行:向量

问题:

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

为什么它必须是一个向量,我为什么要用它呢

为什么我需要将数据填入向量?我还没有在官方的priority_queue文档中读到这方面的内容,所以我想为新手程序员提供一些易于理解的解释


干杯

你不必这么做。但请看
优先级队列的声明
类模板:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
模板<
T类,
类容器=std::vector,
类比较=std::less
>类优先级队列;

除非还提供用于保存数据的底层容器,否则不能提供自定义比较器类型参数。上面这一行的作者认为
vector
是最佳选择。也可以使用符合要求的任何其他容器,例如
deque
,但
vector
被证明最适合大多数应用程序,因此它是默认容器。

您不必这样做。但请看
优先级队列的声明
类模板:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
模板<
T类,
类容器=std::vector,
类比较=std::less
>类优先级队列;

除非还提供用于保存数据的底层容器,否则不能提供自定义比较器类型参数。上面这一行的作者认为
vector
是最佳选择。也可以使用符合要求的任何其他容器,例如
deque
,但
vector
被证明最适合大多数应用程序,因此它是默认容器。

您不必这样做。但请看
优先级队列的声明
类模板:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
模板<
T类,
类容器=std::vector,
类比较=std::less
>类优先级队列;

除非还提供用于保存数据的底层容器,否则不能提供自定义比较器类型参数。上面这一行的作者认为
vector
是最佳选择。也可以使用符合要求的任何其他容器,例如
deque
,但
vector
被证明最适合大多数应用程序,因此它是默认容器。

您不必这样做。但请看
优先级队列的声明
类模板:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
模板<
T类,
类容器=std::vector,
类比较=std::less
>类优先级队列;

除非还提供用于保存数据的底层容器,否则不能提供自定义比较器类型参数。上面这一行的作者认为
vector
是最佳选择。也可以使用符合要求的任何其他容器,例如
deque
,但
vector
证明最适合大多数应用程序,因此它是默认容器。

具体而言,该容器需要满足特定的API并支持随机访问迭代器,哪个
vector
deque
都可以。所以基本上我不能只使用basic struct作为将在priority\u队列中使用的容器,但我必须在使用priority\u队列之前将所有数据从struct重新分配/复制到vector、deque或任何其他容器?是吗?如果您想使用上述行的
优先级队列
类型,请选择“是”。如果您可以使用“自己的”
priority\u队列
专门化,并且您的容器满足要求,您可以让它使用您的容器类型,并将您的容器对象移动到
priority\u队列中
@JamieRandall:您让它听起来好像有很多额外的工作要做,因为您使用的是带有自定义比较器的自定义类型。没有。唯一需要改变的是如何声明
优先级队列
(您提供的模板参数)。在这之后,其余的工作都由
优先级_队列
完成,与任何其他类型的比较器所做的工作量完全相同。具体来说,容器需要实现特定的API并支持随机访问迭代器,哪个
vector
deque
都可以。所以基本上我不能只使用basic struct作为将在priority\u队列中使用的容器,但我必须在使用priority\u队列之前将所有数据从struct重新分配/复制到vector、deque或任何其他容器?是吗?如果您想使用上述行的
优先级队列
类型,请选择“是”。如果您可以使用“自己的”
priority\u队列
专门化,并且您的容器满足要求,您可以让它使用您的容器类型,并将您的容器对象移动到
priority\u队列中
@JamieRandall:您让它听起来好像有很多额外的工作要做,因为您使用的是带有自定义比较器的自定义类型。没有。唯一需要改变的是如何声明
优先级队列
(您提供的模板参数)。在那之后,剩下的