gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:20:13 32 4
gpt4 key购买 nike

我想对 class Person 的对象数组进行排序基于其数据成员' age '.我将对象存储在 vector<Person> v 中.

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

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

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

  3. 四种方法中哪种最好?我觉得方法三最简单。

方法一

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

sort( v.begin(), v.end(), cmp());

方法二

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

sort( v.begin(), v.end(), cmp );

方法三

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

sort( v.begin(), v.end());

方法四

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

最佳答案

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

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

至于哪一个是最好的方法?

好吧,这取决于。使用 operator< 的那个不太灵活,因为它是固定的,但也需要您更少的输入。够用就用。

另一个更灵活,因为您可以传递任何比较函数并相应地对元素进行排序。 operator<时使用不够。此外,当您选择这种风格时,您还有其他选择:比较器可以是一个函数、一个仿函数或一个lambda —如果您使用函数或仿函数(在 namespace 级别定义),那么您可以重用它们;另一方面,lambda 通常在函数范围内定义,因此它不是那么可重用,除非您在命名空间范围内定义它,在这种情况下它几乎相同作为功​​能。

例如,假设您要对 int 的 vector 进行排序按升序排列:

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

输出:-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);

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

希望对您有所帮助。

关于C++ STL - STL sort() 的第三个参数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19887963/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com