为什么 Vector 被用作 Priority Queue 的第二个参数?

3 c++ lambda vector priority-queue decltype

为什么当priority_queue与单个数据类型使用,就像“诠释”,我们初始化像这样:priority_queue<int>; 但是,当它用一对初始化时,我们添加了向量类型的第二个参数priority_queue<pair<int,int>, vector<pair<int,int>>>

另外,我注意到有几种方法可以添加指定排序的第三个参数。

方法 1 - 结构

struct myCompare {
   bool operator()(const pair<int, int>& A, const pair<int, int>& B) {
       return A.second < B.second;
   }
};

priority_queue<pair<int, int>, vector<pair<int, int>>, myCompare> leaderBoard;

Run Code Online (Sandbox Code Playgroud)

方法 2 - Lambda

auto myComp = [](const pair<int, int>& A, const pair<int, int>& B) 
              {return A.second < B.second;};

priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(myComp)> leaderBoard(myComp);
Run Code Online (Sandbox Code Playgroud)

我的问题

  1. 为什么是第二个参数priority_queue一个vector?这是什么意思,什么时候需要指定第二个参数?
  2. 在方法 2 中,为什么decltype需要这个 lambda?
  3. 方法二中,为什么对象leaderBoard需要初始化(myComp)
  4. 在方法2中,为什么不能直接将我的lambda指定为第三个参数?
  5. A.second > B.second和 和有A.second < B.second什么区别?你怎么记得哪个是升序,哪个是降序?

Fur*_*ish 5

为什么当priority_queue与单一数据类型一起使用时,比如“int”,我们像这样初始化它:priority_queue<int>[...] ?

因为std::priority_queue是一个类模板定义如下:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以仅提供 来实例化此类T,因为其余类型将被默认。您可以在此处阅读有关模板默认参数的更多信息。

但是,当它用一对初始化时,我们添加了向量类型的第二个参数priority_queue<pair<int,int>, vector<pair<int,int>>>

因为有人想要明确。priority_queue<pair<int, int>>等价于priority_queue<pair<int,int>, vector<pair<int,int>>>,因为vector<pair<int, int>>默认情况下会出现第二个模板类型 ( )。

  1. 为什么priority_queue的第二个参数是一个向量?这是什么意思,什么时候需要指定第二个参数?

我们不需要明确指定它。第二个模板参数是用于数据内部表示的类型。std::priority_queue是一个容器适配器,这意味着它本身不是一个容器 - 它使用其他容器并用某种实用程序包装它。

  1. 在方法 2 中,为什么这个 lambda 需要 decltype?

因为你需要提供一个类型myCompare是 a struct,所以它是一个类型的名称。myComp不是一个类型,它是一个变量。您希望获得其声明的类型吗?使用decltype.

  1. 在方法2中,为什么对象leaderBoard需要用 初始化(myComp)

因为你不能默认构造一个给定decltypelambda的对象(这在 C++20 中得到了放松)。您需要使用以下构造函数:

explicit priority_queue(const Compare& compare)
    : priority_queue(compare, Container()) { }
Run Code Online (Sandbox Code Playgroud)

它需要一个可调用的(在这种情况下是 lambda),它将用作比较器。

  1. 在方法2中,为什么不能直接将我的lambda指定为第三个参数?

你的意思是作为第三个template参数?因为就目前而言,lambdas 不能在未评估的上下文中使用,为模板提供类型就是其中之一。

5.1. A.second > B.second和 和有A.second < B.second什么区别?

差别还是很明显的。一个检查A.second是否大于第二个参数,另一个则相反。它通常用于排序(用于比较元素)。

5.2 你怎么记得哪个是升序,哪个是降序?

这是非常简单的-的C++概念是使用<之间左手右手边的参数和右手边的说法,像这样:left_hand_side < right_hand_side