gpt4 book ai didi

c++ - std::greater() 和 std::greater 之间的区别?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:47 26 4
gpt4 key购买 nike

此代码有效:

#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() vector 将无法为其元素分配内存。这里int()用作类型模板参数的不是表达式。它是一个类型 ID。

在第二个声明中, vector 处理指向函数的指针,它可以为其指针元素分配内存。

关于c++ - std::greater<int>() 和 std::greater<int> 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44240996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com