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

c – std :: greater()和std :: greater之间的区别?,第1张

概述此代码有效: #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. 此代码有效:

#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,greater<int>() > pq;    pq.push(1);    cout<<pq.top()<<endl;}

为什么?
我所理解的是,更大的< int>()是一个函数对象,priority_queue接受二元谓词作为第三个参数,谓词是一种特殊类型的仿函数.
但是这对括号如何产生差异呢?

解决方法 在这个宣言中

priority_queue<int,greater<int> > pq;

类型模板参数更大< int>对应于结构的类型.

在这个宣言中

priority_queue<int,greater<int>() > pq;

类型模板参数greater< int>()对应于没有参数且返回类型更大的函数的类型< int>

类模板std :: priority_queue期望参数将是函数对象类型,它是指向函数的指针或具有函数运算符的类类型.

为了更清楚地比较这些声明

std::vector<int()> v1;

std::vector<int (*)()> v2;

对于第一个声明,编译器将发出错误,因为运算符sizeof可能不适用于函数类型int(),并且向量将无法为其元素分配内存.这里用作类型模板参数的int()不是表达式.这是一个类型ID.

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

总结

以上是内存溢出为你收集整理的c – std :: greater()和std :: greater之间区别?全部内容,希望文章能够帮你解决c – std :: greater()和std :: greater之间的区别?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存