如何对C++ vector中的自定义类对象进行交换与排序?
C++ 自定义类vector按属性排序实现方案
你不需要手动实现对象交换逻辑,C++标准库的std::sort会自动完成元素的交换/移动操作,仅需指定自定义对象的比较规则即可,两种实现方式任选,10分钟就能改完:
方法1:重载类的<运算符(推荐,代码更简洁)
首先确保你已经引入了必要头文件:#include <algorithm>(sort函数所在头文件)、#include <string>。
在你的Sea类中重载小于比较运算符,对比规则为name属性的字典序:
class Sea { public: std::string name; // 保留你原有类的其他成员、方法不变 // const修饰不能漏,否则sort调用时会报权限错误 bool operator<(const Sea& other) const { // std::string原生的<运算符默认就是按字母顺序做字典序比较,直接复用即可 return this->name < other.name; } };
排序时直接调用标准sort函数即可:
// 你的原有存入对象逻辑不变 std::vector<Sea> seaVector; seaVector.push_back(obj1); seaVector.push_back(obj2); seaVector.push_back(obj3); // 执行排序,默认会调用你重载的<运算符做比较 std::sort(seaVector.begin(), seaVector.end());
方法2:sort时传入自定义比较函数(无需修改原有类定义)
如果你不想改动Sea类的原有代码,可以直接在排序时传入lambda表达式作为比较规则:
// 不需要改Sea类,直接在排序时写比较逻辑 std::sort(seaVector.begin(), seaVector.end(), [](const Sea& a, const Sea& b) { return a.name < b.name; });
注意事项
- 不需要手动写元素交换逻辑:只要你没有手动删除
Sea类的拷贝构造、移动构造函数,编译器默认生成的实现就足够支撑std::sort的交换操作 - 如果需要忽略大小写排序,只需要修改比较逻辑,把两个name统一转为大写/小写后再比较即可
- 排序后vector内的元素就已经按照name的字母顺序升序排列,直接遍历使用即可
内容的提问来源于stack exchange,提问作者Aleko Verulashvili
相关产品推荐
相关产品推荐

