C++ STL - STL sort()的第三个参数如何工作?

use*_*151 7 c++ sorting lambda stl

我希望class Person根据其数据成员' age' 对一系列对象进行排序.我将对象存储在一个vector<Person> v.

据我所知,至少有4种方法可以执行此操作,我根据下面的方法提出以下问题.

  1. 如何operator()在一个类中定义工作?我不应该在这里重载"<"运算符吗?为什么'()'?

  2. 我在方法1中发送了一个对象作为第3个参数.但是,在方法2中,我发送了一个函数的名称.为什么会那样?

  3. 四种方法中哪一种最好?我觉得方法3是最简单的.

方法1

class cmp
{
public:
    bool operator() (  Person const &a,  Person const &b )
    {
        return a.age < b.age ;
    }
};

sort( v.begin(), v.end(), cmp());
Run Code Online (Sandbox Code Playgroud)

方法2

bool cmp( const Person a, const Person b ) 
{
    return a.age < b.age ;
}

sort( v.begin(), v.end(), cmp );
Run Code Online (Sandbox Code Playgroud)

方法3

bool operator < ( const Person a, const Person b )
{
    return a.age < b.age ;
}

sort( v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

方法4

//using lambda expression
sort( v.begin(), v.end(), [](const Person &a, const Person &b){return a.age < b.age;});
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 6

为了使用std::sort(或与此相关的任何函数)对范围进行排序,它需要知道如何比较范围中的两个元素,以便确定小于(或大于)关系。

标准库函数std::sort两种形式:一种使用operator<,另一种使用比较功能/函数。您已经在代码中同时使用了它们两者-特别是,示例中的第三个使用<了代码,其余的使用了比较功能/函数。

至于哪种方法最好?

这得看情况。它使用一个operator<不太灵活,因为它是固定的,但需要你输入更少为好。足够时使用它。

另一个更灵活,因为您可以传递任何比较函数并相应地对元素进行排序。在operator<不足时使用。同样,当您选择这种风格时,您还有其他选择:比较器可以是functionfunctorlambda-如果您使用function或functor(在名称空间级别定义),则可以重用它们;另一方面,lambda 通常是在函数范围内定义的,因此它不是可重用的,除非您在名称空间范围内定义它,在这种情况下,它几乎与函数相同。

例如,假设您要按升序对向量进行排序int

 std::vector<int>  v{10, 3, 12, -26};
 std::sort(v.begin(), v.end());
 print(v);
Run Code Online (Sandbox Code Playgroud)

输出:-26,3,10,12。因此,operator<可以完成任务。

但是,如果您希望仅考虑幅度而对元素进行排序(即忽略符号),那您就必须使用其他形式:

 std::vector<int>  v{10, 3, 12, -26};
 auto abs_cmp = [](int a, int b) { return std::abs(a) < std::abs(b); };
 std::sort(v.begin(), v.end(), abs_cmp);
 print(v);
Run Code Online (Sandbox Code Playgroud)

输出:3,10,12,-26。在这种情况下,这就是您期望的输出。

希望能有所帮助。