在类中定义sort的比较函数

本文介绍在C++类中如何正确实现和使用自定义的sort比较函数。通过一个具体的例子展示了如何避免编译错误,并成功对二维vector进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在类中定义sort的比较函数

我声明了一个类,类中成员函数调用了二维vector参数:candidate_set,代码如下:

class StarIdentify
{
public:
    StarIdentify(void);
    ~StarIdentify(void);
    double Identify_Basis_Pair();   
private: ;
    //升序函数
    bool LessSort (vector<double> a,vector<double> b);
    vector<vector<double>> candidate_set;
};

升序函数定义如下:

bool StarIdentify::LessSort (vector<double> a,vector<double> b) 
{ return a[0]<b[0]; }

想在函数Identify_Basis_Pair中调用vector的比较函数

sort(candidate_set.begin(),candidate_set.end(),LessSort);

但编译会出错,提示LessSort缺少两个参数。

解决方式如下
声明为静态成员函数:

class StarIdentify
{
public:
    StarIdentify(void);
    ~StarIdentify(void);
    double Identify_Basis_Pair();   
private: ;
    //升序函数
    bool static LessSort (vector<double> a,vector<double> b);
    vector<vector<double>> candidate_set;
};

这样调用就可以了:

sort(candidate_set.begin(),candidate_set.end(),StarIdentify::LessSort);

相关帖子

<think>我们被要求使用lambda表达式作为C++ sort函数的参数来自定义排序规则。根据引用,lambda表达式提供了一种简洁的方式来定义匿名函数,特别适合用于自定义排序逻辑。 基本步骤: 1. 包含必要的头文件:<algorithm> 用于使用sort函数。 2. 准备要排序的容器,例如vector。 3. 在sort函数的第三个参数位置,直接写入lambda表达式,或者先定义一个lambda函数再传入。 lambda表达式的基本语法: [capture](parameters) -> return_type { function_body } 在排序中,我们通常需要定义一个比较函数,该函数接受两个参数(容器的元素型),并返回一个bool值,表示第一个参数是否应该排在第二个参数之前。 例如,对于整数向量的降序排序,我们可以这样写: sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; }); 注意:默认情况下,sort是升序排序(即使用小于比较)。如果我们希望降序,则返回a>b,表示当a大于b时,a应该排在b的前面。 如果我们要对自定义结构体或进行排序,同样可以使用lambda表达式。 例如,有一个结构体Person,包含name和age,我们想按年龄升序排序: sort(people.begin(), people.end(), [](const Person& a, const Person& b) { return a.age < b.age; }); 下面我们通过几个示例来详细说明。 示例1:整数向量的排序(升序和降序) 示例2:结构体多属性排序(先按年龄升序,年龄相同按姓名降序等) 注意:lambda表达式可以直接写在sort函数调用中,这样代码更紧凑,但若需要重复使用,也可以将其赋值给一个变量(auto型)然后传入。 根据引用[2]和[4]中的例子,我们可以写出如下代码:</think>在C++中,使用lambda表达式作为`std::sort`的自定义排序参数,可通过以下步骤实现: ### 基本语法与用法 ```cpp #include <algorithm> #include <vector> int main() { std::vector<int> vec = {3, 1, 4, 1, 5, 9}; // 使用lambda定义降序排序规则 std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; // 当a>b时,a排在b前面 }); // 结果:vec = {9, 5, 4, 3, 1, 1} return 0; } ``` ### 结构体/排序示例 ```cpp #include <algorithm> #include <vector> #include <string> struct Person { std::string name; int age; double height; }; int main() { std::vector<Person> people = { {"Alice", 25, 165.2}, {"Bob", 30, 180.1}, {"Carol", 25, 170.5} }; // 多级排序:年龄升序,年龄相同时身高降序 std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) { if (a.age != b.age) return a.age < b.age; // 年龄升序 else return a.height > b.height; // 身高降序 }); /* 排序后: Carol: 25岁/170.5cm Alice: 25岁/165.2cm Bob: 30岁/180.1cm */ return 0; } ``` ### 关键说明 1. **Lambda语法结构** `[](参数) { 函数体 }`: - **捕获列表 `[]`**:通常为空(不捕获外部变量) - **参数**:两个同型的元素(如 `int a, int b` 或 `const Person& a, const Person& b`) - **返回值**:`bool` 型,表示 `a` 是否应排在 `b` 前面 2. **排序规则设计** - 返回 `true`:`a` 排在 `b` 前 - 返回 `false`:`a` 不排在 `b` 前(包括相等情况) - 多级排序使用条件嵌套(如示例中的年龄和身高) 3. **性能与安全** - 优先使用 `const&` 传递对象(避免拷贝开销) - 确保比较逻辑满足**严格弱序**(例如相等时返回 `false`) ### 应用场景 1. **多维度数据排序**(如先按价格再按评分排序商品) 2. **特殊规则排序**(如按字符串长度、自定义优先级) 3. **临时排序逻辑**(无需单独定义比较函数/仿函数) > 通过lambda表达式,可直接在`sort()`调用处内联定义排序逻辑,使代码更简洁直观,同时保持灵活性[^2][^3][^4]。 --- ### 相关问题 1. 如何在lambda表达式中捕获外部变量进行排序? 2. 当排序规则需要复用多次时,如何优化lambda表达式的使用? 3. 自定义排序时违反严格弱序规则会导致什么问题?如何避免? 4. 除了`std::sort`,C++中还有哪些算法可以搭配lambda表达式使用?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值