首页 > 解决方案 > 作为比较器的函数类

问题描述

1)如果我希望集合按降序存储元素,我可以写:

set<int, greater<int>> s;

但我也可以

set<int, greater<>> s;

编译器如何理解这一点?

2)为什么在以下情况下

vector<int> a;
binary_search(a.begin(), a.end(), 5, greater<>());

我必须写更大的<>(),而不是更大的<>。这有一些原因为什么不能在所有地方都做同样的事情?

标签: c++templates

解决方案


1)编译器如何理解这一点?

因为从 C++14 开始,模板参数Tstd::greater一个默认值void;那么std::greater<>就和 一样std::greater<void>

标准库提供了一个特殊的std::greaterwhen Tis 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<>(它是一个类型)作为模板参数。


推荐阅读