【发布时间】:2020-02-14 21:50:26
【问题描述】:
std::min 和 std::max 允许自定义比较器,但我对排序的工作原理有点困惑。
考虑以下几点:
int i = 1;
int j = 2;
auto min_val = min(i, j, [](const auto val1, const auto val2){
if(val1 < val2) return true;
return false;
});
这将返回最小值,即i。但我不明白为什么我们使用< 而不是>,以及为什么val1 和val2 分别出现在操作数的左侧和右侧。
考虑以下几点:
int i = 1;
int j = 2;
auto max_val = max(i, j, [](const auto val1, const auto val2){
if(val1 > val2) return true;
return false;
});
我原以为这会返回最大值,但实际上返回的是最小值,而且我们必须再次使用< 操作数。有人可以解释引擎盖下发生了什么吗?
我在其他一些问题上也遇到过这个问题,我认为是 std::priority_queue 和 std::map,其中排序和比较运算符对我来说不是很直观,大多数时候我必须猜测和检查得到我想要的。
【问题讨论】:
-
如果您感到困惑或不记得,请查阅参考资料。 cppreference 对函子的期望非常清楚。见:en.cppreference.com/w/cpp/algorithm/max
-
@NathanOliver 我确实查看了 cpprefernce 的最小值和最大值,但其中一个有错字,因为两者的仿函数描述相同。
-
这不是错字。应该是这样的。
-
正如 Timo 所说,这不是拼写错误。两个函数除了第一个参数返回的 true 小于第二个参数。您可以使用类似的比较器编写 min 和 max 函数。
-
@Timo 哦,那我想这正是我在 OP 中使用 sn-ps 发现的。我认为我的困惑是函数如何处理函子的返回值,我认为网站上没有描述。
标签: c++ max min comparison-operators