std::greater<int>() 和 std::greater<int> 的区别?
Difference between std::greater<int>() and std::greater<int>?
此代码有效:
#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
接受二元谓词作为第三个参数,并且谓词是一种特殊类型的函子。
但是这副牙套是如何造成这种差异的呢。
来自cppreference:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
Compare - A Compare type providing a strict weak ordering.
所以对于 std::priority_queue 你传递一种比较器作为模板参数。
另一方面,
greater<int>()
代表创建类型为 greater<int>
的新对象,这在您的情况下不是一个选项。
在此声明中
priority_queue<int,vector<int>,greater<int> > pq;
类型模板参数greater<int>
对应于结构的类型。
在此声明中
priority_queue<int,vector<int>,greater<int>() > pq;
类型模板参数 greater<int>()
对应于没有参数且具有 return 类型 greater<int>
的函数类型
class 模板 std::priority_queue
期望参数是函数对象类型,它是指向函数的指针或具有函数运算符的 class 类型。
为了更清楚地比较这些声明
std::vector<int()> v1;
和
std::vector<int (*)()> v2;
对于第一个声明,编译器将发出错误,因为运算符 sizeof 可能不适用于函数类型 int()
,并且向量将无法为其元素分配内存。这里用作类型模板参数的 int()
不是表达式。它是一个类型标识。
在第二个声明中,向量处理指向函数的指针,它可以为其指针元素分配内存。
此代码有效:
#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
接受二元谓词作为第三个参数,并且谓词是一种特殊类型的函子。
但是这副牙套是如何造成这种差异的呢。
来自cppreference:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
Compare - A Compare type providing a strict weak ordering.
所以对于 std::priority_queue 你传递一种比较器作为模板参数。
另一方面,
greater<int>()
代表创建类型为 greater<int>
的新对象,这在您的情况下不是一个选项。
在此声明中
priority_queue<int,vector<int>,greater<int> > pq;
类型模板参数greater<int>
对应于结构的类型。
在此声明中
priority_queue<int,vector<int>,greater<int>() > pq;
类型模板参数 greater<int>()
对应于没有参数且具有 return 类型 greater<int>
class 模板 std::priority_queue
期望参数是函数对象类型,它是指向函数的指针或具有函数运算符的 class 类型。
为了更清楚地比较这些声明
std::vector<int()> v1;
和
std::vector<int (*)()> v2;
对于第一个声明,编译器将发出错误,因为运算符 sizeof 可能不适用于函数类型 int()
,并且向量将无法为其元素分配内存。这里用作类型模板参数的 int()
不是表达式。它是一个类型标识。
在第二个声明中,向量处理指向函数的指针,它可以为其指针元素分配内存。