c++算法 | 排序| 泛型排序一劳永逸

文章工具
// ====================== C++ 泛型排序完整指南 ======================// 场景:Product(价格/库存)、Student(分数/年龄)等都需要按某个字段排序// 目标:写一次排序函数,所有类通用,类型安全,零开销
#include <iostream>#include <vector>#include <algorithm>#include <functional>#include <string>
// ====================== 示例类(待排序) ======================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;        else            return 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:宏简化(不推荐,仅作了解) ======================#define SORT_BY_FIELD(vec, type, field, asc)     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


#C++泛型编程
 #代码复用技巧 
#面试技巧 
#后端开发必会 
#排序算法实战

⚠️ 版权声明

本文为免费文章,欢迎转载。转载请注明出处:一木科技(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/),并保留原文链接。