关于 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;
});
这将返回最小值,即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
中,排序和比较运算符对我来说不是很直观,大多数时候我必须猜测和检查才能得到我想要的。
这基本上归结为如何在标准中定义这些功能。 例如,std::max
定义比较器(您的 lambda(如下:
函数对象(即满足比较要求的对象(,如果 a 小于 b,则返回 true。
通常,当涉及到 c++ 标准库中的值顺序时,它(几乎?(总是std::less
用作默认比较器,这完全left < right
。
至于为什么总是a < b
必须满足,我认为这只是为了减少编码开销,如果你要自己编写的话。想象一下,有一个这样的比较器:
struct MyComp
{
bool operator()(MyType a, MyType b) const
{
return a.getValue() < b.getValue();
}
};
由于标准库中的所有构造都要求比较器返回 true,如果a < b
,则可以对多个构造使用一个简单的比较器。 例如
auto maxVal = std::max(a, b, MyComp{});
auto minVal = std::min(a, b, MyComp{});
std::map<MyType, MyComp> myMap;
将只与一个比较器一起工作。
相关文章:
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 关于 std::min, std::max 中的比较运算符的混淆
- std::max() 函数与定点实现的比较中的问题
- std::less是否应该允许在编译时比较不相关的指针?
- 重构使用动态强制转换的 std::set 的比较运算符
- 比较两个 std::chrono::time_point 实例时出错
- std::out_of_range字符串比较中的异常
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 比较 std::string 和 C 样式字符串文字
- 不使用与左右停止工作命名空间 std 的简单比较
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 如何更改 std::set 的比较函数?
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果
- 用于比较基元类型的std::可选的有趣程序集
- std:比较不可代表数字的映射技巧