如何在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
相关产品推荐
相关产品推荐

