关于 std::sort 的比较函数对象

About the comparison function object of std::sort

本文关键字:函数 对象 比较 sort std 关于      更新时间:2023-10-16

在以下两个示例中:示例 1:

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};
std::vector < MyStruct > vec;
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
std::sort(vec.begin(), vec.end(), less_than_key());  //LINE1

示例 2:

std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; 
struct {
    bool operator()(int a, int b)
    {   
        return a < b;
    }   
} customLess;
std::sort(s.begin(), s.end(), customLess);        //LINE2

为什么 LINE1 中的比较函数对象有"()",即 less_than_key()? LINE2 处的比较函数对象没有 "()",即 customLess?

1 行有括号,因为它正在创建less_than_key类的实例并将其作为参数传递(即它正在生成值)。

第 2 行没有括号,因为它已经是提供的匿名结构的实例(即它已经是一个值)。

std::sort期望比较器对象的实例能够工作,这就是为什么您有时可以就地构造它们或提供已构造的对象。

在示例 1 中,您声明了一个名为 less_than_key 的结构,但您没有此结构的任何实例,您只有一个声明。在第 1 行中,您正在调用结构的构造函数并创建要由 std::sort 函数使用的对象的实例。

在示例 2 中,情况有所不同。您还声明了一个结构,这次没有名称(匿名),但不同之处在于您正在创建这种类型的"customLess"实例(隐式调用构造函数)。因此,由于您已经创建了实例,因此无需在 std::sort 函数中创建它。

看看结构声明的差异:

1.- 结构less_than_key { ... };

2.- 结构 [some_name_if_wanted] { ... } 自定义无;

std::sort需要一个比较函数对象。在第一个示例中,您正在构造一个对象。在第二个示例中,您已经有一个。最简单的例子是查看透明比较器,即std::less<>(),这是一个类模板。