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)
我的问题
priority_queue
一个vector
?这是什么意思,什么时候需要指定第二个参数?decltype
需要这个 lambda?leaderBoard
需要初始化(myComp)
A.second > B.second
和 和有A.second < B.second
什么区别?你怎么记得哪个是升序,哪个是降序?为什么当
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>>
默认情况下会出现第二个模板类型 ( )。
- 为什么priority_queue的第二个参数是一个向量?这是什么意思,什么时候需要指定第二个参数?
我们不需要明确指定它。第二个模板参数是用于数据内部表示的类型。std::priority_queue
是一个容器适配器,这意味着它本身不是一个容器 - 它使用其他容器并用某种实用程序包装它。
- 在方法 2 中,为什么这个 lambda 需要 decltype?
因为你需要提供一个类型。myCompare
是 a struct
,所以它是一个类型的名称。myComp
不是一个类型,它是一个变量。您希望获得其声明的类型吗?使用decltype
.
- 在方法2中,为什么对象leaderBoard需要用 初始化
(myComp)
?
因为你不能默认构造一个给定decltype
lambda的对象(这在 C++20 中得到了放松)。您需要使用以下构造函数:
explicit priority_queue(const Compare& compare)
: priority_queue(compare, Container()) { }
Run Code Online (Sandbox Code Playgroud)
它需要一个可调用的(在这种情况下是 lambda),它将用作比较器。
- 在方法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
。
归档时间: |
|
查看次数: |
658 次 |
最近记录: |