【发布时间】:2018-02-13 11:07:55
【问题描述】:
我试图理解 stl 中的优先级队列。我的理解是第三个参数基本上是类型名(在这种情况下是函数指针)。那么,如果它只接受 typename,如果它只接受 typename 而不是实际的函数指针,它将如何访问我的 compare 函数?
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool comp(int a,int b){
return a<b;
}
int main()
{
int (*p)(int,int);
p=comp;
priority_queue< int,vector<int>,decltype(&comp) > pq;
decltype(p) a;
cout<<typeid(a).name();
}
【问题讨论】:
-
在这种情况下,它不会。查看其constructor,优先级队列采用所选类型的可选比较器。当它类似于
std::less<T>时,默认构造对象就可以了,但是使用函数指针,您必须明确指定要使用的函数,否则您很快就会遇到问题。 -
@Caninonos 那么,我必须像这样发送吗?
priority_queue< int,vector<int>,decltype(p) > pq(comp);但是,当我尝试将参数作为函子发送时,我不需要显式发送函数,为什么? -
你也不需要
p。只需指定decltype(comp) *即可。 -
是的。好吧,当然,如果你愿意,你也可以给它一个自定义分配器、自定义底层容器等。但这足以构建一个优先级队列,以后不会导致未定义的行为。 (顺便说一句,您是否尝试过以这种方式指定比较函数和不指定比较函数?您应该很快就能看出区别)
标签: c++ stl function-pointers priority-queue decltype