C++20 范围算法支持投影,显然与 STL 算法一样,它们支持自定义比较器。
但我发现令人费解的是投影和比较器的顺序。
我的“问题”(更烦人,我将很快学会使用这种参数顺序)是它破坏了从左到右的代码流。
考虑下面的代码(很抱歉它不短,但这就是重点,以表明在实际代码中,当变量名称不是 2 个字母长时,参数的顺序会使代码更难阅读):
struct PointyPoint {
int x;
int y;
};
struct Item {
std::string name;
PointyPoint location;
};
//...
std::ranges::sort(
items,
[](const PointyPoint &a, const PointyPoint &b) {
return std::tie(a.x, a.y) < std::tie(b.x, b.y);
},
&Item::location);
我对这段代码的问题是,如果投影在 lambda(比较器)之前,我认为它看起来会更好。
完整的代码神螺栓。
我认为这个订单被选中的原因:
- STL 算法通常将比较器作为第三个参数(迭代器之后的第一个参数),因此它是匹配的
- 也许自定义比较器比投影更常见,因此避免需要提供该参数