关于 std::min、std::max 中比较运算符的混淆
Confusion regarding comparison operators in std::min, std::max
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;
});
这个return是最小值,也就是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;
});
我以为这会return最大值,但实际上return是最小值,而且,我们必须使用<
操作数。有人可以解释引擎盖下发生了什么吗?
我已经 运行 在其他一些东西上解决了这个问题,我认为 std::priority_queue
和 std::map
,其中排序和比较运算符对我来说不是很直观,而且大多数时候我必须猜测和检查才能得到我想要的东西。
这基本上归结为这些函数在标准中的定义方式。例如std::max
,定义比较器(你的lambda)如下:
comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if a is less than b.
通常,当涉及到 c++ 标准库中值的顺序时,它(几乎?)总是 std::less
用作默认比较器,它恰好 left < right
。
至于为什么总是a < b
必须满足我认为如果您自己编写它只是为了减少编码开销。想象一下有这样一个比较器:
struct MyComp
{
bool operator()(MyType a, MyType b) const
{
return a.getValue() < b.getValue();
}
};
由于标准库中的所有构造都要求您的比较器 return 为真,如果 a < b
,您可以对多个构造使用一个简单的比较器。例如
auto maxVal = std::max(a, b, MyComp{});
auto minVal = std::min(a, b, MyComp{});
std::map<MyType, MyComp> myMap;
都将只与一个比较器一起工作。
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;
});
这个return是最小值,也就是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;
});
我以为这会return最大值,但实际上return是最小值,而且,我们必须使用<
操作数。有人可以解释引擎盖下发生了什么吗?
我已经 运行 在其他一些东西上解决了这个问题,我认为 std::priority_queue
和 std::map
,其中排序和比较运算符对我来说不是很直观,而且大多数时候我必须猜测和检查才能得到我想要的东西。
这基本上归结为这些函数在标准中的定义方式。例如std::max
,定义比较器(你的lambda)如下:
comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if a is less than b.
通常,当涉及到 c++ 标准库中值的顺序时,它(几乎?)总是 std::less
用作默认比较器,它恰好 left < right
。
至于为什么总是a < b
必须满足我认为如果您自己编写它只是为了减少编码开销。想象一下有这样一个比较器:
struct MyComp
{
bool operator()(MyType a, MyType b) const
{
return a.getValue() < b.getValue();
}
};
由于标准库中的所有构造都要求您的比较器 return 为真,如果 a < b
,您可以对多个构造使用一个简单的比较器。例如
auto maxVal = std::max(a, b, MyComp{});
auto minVal = std::min(a, b, MyComp{});
std::map<MyType, MyComp> myMap;
都将只与一个比较器一起工作。