此代码有效:
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> > pq;
pq.push(1);
cout<<pq.top()<<endl;
}
但是,此代码无法编译:
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int>() > pq;
pq.push(1);
cout<<pq.top()<<endl;
}
为什么?
我所了解的是,它greater<int>()
是一个函数对象,并且priority_queue
接受二进制谓词作为第三个参数,并且谓词是一种特殊的函子类型。但是这对大括号如何使这一点有所不同。
在此声明中
priority_queue<int,vector<int>,greater<int> > pq;
类型模板参数greater<int>
对应于结构的类型。
在此声明中
priority_queue<int,vector<int>,greater<int>() > pq;
类型模板参数greater<int>()
对应于没有参数且具有返回类型的函数的类型greater<int>
类模板std::priority_queue
期望参数将是作为函数指针的函数对象类型或具有函数运算符的类类型。
为了更清楚地比较这些声明,例如
std::vector<int()> v1;
和
std::vector<int (*)()> v2;
对于第一个声明,编译器将发出错误,因为运算符sizeof可能不会应用于函数类型int()
,并且向量将无法为其元素分配内存。这里int()
用作类型模板参数的不是表达式。这是一个类型标识。
在第二个声明中,向量处理指向函数的指针,它可以为其作为指针的元素分配内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句