You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中对指针列表按MyClass的ID升序排序(无需手动实现)

当然可以!不用手动实现排序算法就能完成需求

完全不用自己写冒泡、快排这类排序逻辑——C++标准库已经提供了现成的工具,我们只需要利用std::list自带的sort成员函数,配合自定义的比较规则即可。

第一步:先解决MyClass的私有成员访问问题

你的MyClass中id是私有成员,外部代码无法直接读取,所以需要给它添加一个公共的getter方法:

class MyClass { 
private: 
    int id; 
public: 
    MyClass(int id) : id(id) {} // 这里建议用初始化列表,比this->id=id更规范
    int getId() const { return id; } // 新增公共getter,用于获取id值
};

第二步:利用std::list::sort完成排序

std::list不支持全局的std::sort(因为需要随机访问迭代器),但它自带了sort成员函数,我们只需要传入一个比较两个元素的规则即可。

方式一:用Lambda表达式(C++11及以上推荐)

这是最简洁的写法,直接在调用sort时定义比较逻辑:

// 解引用myList得到list对象,然后调用sort
myList->sort([](const pair<MyClass*, double>* a, const pair<MyClass*, double>* b) {
    // 先检查指针是否为空,避免空指针解引用导致崩溃
    if (!a || !b) {
        // 这里可以自定义空指针的排序规则,比如把空指针放在最前面
        return a == nullptr;
    }
    // 按MyClass的id升序排列
    return a->first->getId() < b->first->getId();
});

方式二:用普通比较函数(兼容C++11之前的版本)

如果你需要兼容旧版本C++,可以单独写一个比较函数:

// 定义比较函数
bool comparePairPtrs(const pair<MyClass*, double>* a, const pair<MyClass*, double>* b) {
    if (!a || !b) {
        return a == nullptr;
    }
    return a->first->getId() < b->first->getId();
}

// 调用sort时传入函数名
myList->sort(comparePairPtrs);

验证效果

按照你给出的示例:

  • 你按pair2(id=2)、pair3(id=3)、pair1(id=1)的顺序加入列表
  • 调用上述排序代码后,列表会自动调整为pair1、pair2、pair3的顺序,完全符合你的需求。

额外提醒:注意内存管理

你代码中所有的MyClass和pair对象都是用new手动分配的,记得在程序结束或不需要这些对象时,逐个释放内存(避免内存泄漏)。如果可以的话,建议改用std::unique_ptr这类智能指针,让系统自动管理内存,减少手动释放的麻烦。

内容的提问来源于stack exchange,提问作者Antonio1996

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:19