c++算法 | 排序| 泛型排序一劳永逸
// ====================== C++ 泛型排序完整指南 ======================// 场景:Product(价格/库存)、Student(分数/年龄)等都需要按某个字段排序// 目标:写一次排序函数,所有类通用,类型安全,零开销// ====================== 示例类(待排序) ======================class Product {public:std::string name;double price;int stock;Product(const std::string& n, double p, int s): name(n), price(p), stock(s) {}void print() const {std::cout << name << " | 价格:" << price << " | 库存:" << stock << std::endl;}};class Student {public:std::string name;int score;int age;Student(const std::string& n, int s, int a): name(n), score(s), age(a) {}void print() const {std::cout << name << " | 分数:" << score << " | 年龄:" << age << std::endl;}};// ====================== 方案1:成员指针(最推荐,零开销) ======================template<typename T, typename FieldType>void sortByField(std::vector<T>& items, FieldType T::* fieldPtr, bool ascending = true) {std::sort(items.begin(), items.end(), [fieldPtr, ascending](const T& a, const T& b) {if (ascending)return a.*fieldPtr < b.*fieldPtr;elsereturn a.*fieldPtr > b.*fieldPtr;});}// ====================== 方案2:支持多种比较器(更灵活) ======================template<typename T, typename Comparator>void sortCustom(std::vector<T>& items, Comparator cmp) {std::sort(items.begin(), items.end(), cmp);}// 辅助生成比较器(按字段,可升降序)template<typename T, typename FieldType>auto makeComparator(FieldType T::* fieldPtr, bool ascending = true) {return [fieldPtr, ascending](const T& a, const T& b) {return ascending ? (a.*fieldPtr < b.*fieldPtr) : (a.*fieldPtr > b.*fieldPtr);};}// ====================== 方案3:链式多字段排序 ======================template<typename T, typename... FieldPtrs>void sortByMultipleFields(std::vector<T>& items, FieldPtrs... fields) {std::sort(items.begin(), items.end(), [fields...](const T& a, const T& b) {return compareTuple(a, b, fields...);});}// 递归比较多个字段template<typename T, typename FieldType, typename... Rest>bool compareTuple(const T& a, const T& b, FieldType T::* first, Rest... rest) {if (a.*first != b.*first)return a.*first < b.*first;if constexpr (sizeof...(rest) > 0)return compareTuple(a, b, rest...);return false; // 完全相等}// ====================== 方案4:极简封装(一行调用) ======================class SortHelper {public:template<typename T, typename FieldType>static void by(std::vector<T>& items, FieldType T::* field, bool asc = true) {std::sort(items.begin(), items.end(),[field, asc](const T& a, const T& b) {return asc ? a.*field < b.*field : a.*field > b.*field;});}};// ====================== 方案5:宏简化(不推荐,仅作了解) ======================std::sort(vec.begin(), vec.end(), [](const type& a, const type& b) {return asc ? a.field < b.field : a.field > b.field;})// ====================== 完整使用示例 ======================int main() {std::cout << "========== 原始数据 ==========" << std::endl;std::vector<Product> products = {{"鼠标", 50.0, 100},{"键盘", 200.0, 50},{"显示器", 150.0, 30},{"耳机", 80.0, 80}};std::vector<Student> students = {{"张三", 85, 18},{"李四", 92, 19},{"王五", 78, 17},{"赵六", 88, 20}};// ----- 方案1:按价格升序 -----std::cout << "n[方案1] 产品按价格升序:" << std::endl;sortByField(products, &Product::price, true);for (const auto& p : products) p.print();// ----- 方案2:按分数降序(使用比较器)-----std::cout << "n[方案2] 学生按分数降序:" << std::endl;auto cmp = makeComparator(&Student::score, false);sortCustom(students, cmp);for (const auto& s : students) s.print();// ----- 方案3:多字段排序(价格优先,其次库存)-----std::cout << "n[方案3] 产品按价格升序,价格相同按库存降序:" << std::endl;std::vector<Product> p2 = {{"鼠标", 80.0, 100},{"键盘", 80.0, 30},{"耳机", 80.0, 80}};sortByMultipleFields(p2, &Product::price, &Product::stock);for (const auto& p : p2) p.print();// ----- 方案4:极简调用 -----std::cout << "n[方案4] 学生按年龄升序(SortHelper):" << std::endl;std::vector<Student> s2 = {{"张三", 85, 18},{"李四", 92, 22},{"王五", 78, 17}};SortHelper::by(s2, &Student::age, true);for (const auto& s : s2) s.print();// ----- 方案5:宏(不推荐)-----std::cout << "n[方案5] 宏方式排序(仅演示):" << std::endl;std::vector<Product> p3 = {{"A", 100, 1}, {"B", 50, 2}};SORT_BY_FIELD(p3, Product, price, true);for (const auto& p : p3) p.print();return 0;}
// ====================== 输出效果预览 ======================// [方案1] 产品按价格升序:// 鼠标 | 价格:50 | 库存:100// 耳机 | 价格:80 | 库存:80// 显示器 | 价格:150 | 库存:30// 键盘 | 价格:200 | 库存:50//// [方案2] 学生按分数降序:// 李四 | 分数:92 | 年龄:19// 赵六 | 分数:88 | 年龄:20// 张三 | 分数:85 | 年龄:18// 王五 | 分数:78 | 年龄:17//// [方案3] 产品按价格升序,价格相同按库存降序:// 键盘 | 价格:80 | 库存:30// 耳机 | 价格:80 | 库存:80// 鼠标 | 价格:80 | 库存:100//// [方案4] 学生按年龄升序(SortHelper):// 王五 | 分数:78 | 年龄:17// 张三 | 分数:85 | 年龄:18// 李四 | 分数:92 | 年龄:22
⚠️ 版权声明
本文为免费文章,欢迎转载。转载请注明出处:一木科技(https://www.pingquan.vip/2026/05/31/c%e7%ae%97%e6%b3%95-%e6%8e%92%e5%ba%8f-%e6%b3%9b%e5%9e%8b%e6%8e%92%e5%ba%8f%e4%b8%80%e5%8a%b3%e6%b0%b8%e9%80%b8/),并保留原文链接。
还没有评论,来说两句?