use*_*151 7 c++ sorting lambda stl
我希望class Person根据其数据成员' age' 对一系列对象进行排序.我将对象存储在一个vector<Person> v.
据我所知,至少有4种方法可以执行此操作,我根据下面的方法提出以下问题.
如何operator()在一个类中定义工作?我不应该在这里重载"<"运算符吗?为什么'()'?
我在方法1中发送了一个对象作为第3个参数.但是,在方法2中,我发送了一个函数的名称.为什么会那样?
四种方法中哪一种最好?我觉得方法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)
为了使用std::sort(或与此相关的任何函数)对范围进行排序,它需要知道如何比较范围中的两个元素,以便确定小于(或大于)关系。
标准库函数std::sort有两种形式:一种使用operator<,另一种使用比较功能/函数。您已经在代码中同时使用了它们两者-特别是,示例中的第三个使用<了代码,其余的使用了比较功能/函数。
至于哪种方法最好?
这得看情况。它使用一个operator<是不太灵活,因为它是固定的,但需要你输入更少为好。足够时使用它。
另一个更灵活,因为您可以传递任何比较函数并相应地对元素进行排序。在operator<不足时使用。同样,当您选择这种风格时,您还有其他选择:比较器可以是function,functor或lambda-如果您使用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。在这种情况下,这就是您期望的输出。
希望能有所帮助。
| 归档时间: |
|
| 查看次数: |
5049 次 |
| 最近记录: |