c++ - 作为比较器的函数类
问题描述
1)如果我希望集合按降序存储元素,我可以写:
set<int, greater<int>> s;
但我也可以
set<int, greater<>> s;
编译器如何理解这一点?
2)为什么在以下情况下
vector<int> a;
binary_search(a.begin(), a.end(), 5, greater<>());
我必须写更大的<>(),而不是更大的<>。这有一些原因为什么不能在所有地方都做同样的事情?
解决方案
1)编译器如何理解这一点?
因为从 C++14 开始,模板参数T
有std::greater
一个默认值void
;那么std::greater<>
就和 一样std::greater<void>
。
标准库提供了一个特殊的
std::greater
whenT
is not specified,这使得参数类型和返回类型有待推导。
和
2)这有一些原因为什么不能在任何地方都做同样的事情?
因为binary_search
是一个函数并且期望它的参数作为对象。greater<>
(ie greater<void>
) 是type, whilegreater<>()
是object(它是 的上下文中的临时对象binary_search(a.begin(), a.end(), 5, greater<>());
)。
顺便说一句:在set<int, greater<>> s;
中,您指定greater<>
为模板参数。的第二个模板参数std::set
是一个类型模板参数
,那么可以指定greater<>
(它是一个类型)作为模板参数。
推荐阅读
- couchbase - 在 Couchbase 中是否可以为非 JSON 文档设置和获取 XATTR 值?
- excel - 从路径的一部分是变量 VBA 的子文件夹中处理文件
- kubernetes - Kubernetes imagePullSecrets 不工作;拉取访问被拒绝
- snowflake-cloud-data-platform - 插入值列表与期望 36 但得到 30 的列列表不匹配
- python - 检索列表值并使用用户输入更改值
- python - 如何将动态参数传递给 datetime.timedelta 函数?
- sql - Read Uncommitted 是否违反了 Atomcity?
- c# - C# 使用数组启用/禁用按钮,Win 表单/MVP
- css - 如果我为侧边栏设置位置:固定,图标就会消失
- sql - 用于合并重复项的存储过程 Firebird