首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 結構體陣列多鍵值排序:qsort 比較函數寫法

     編輯:程式設計疑難解答

需求

結構體陣列需按多欄位排序(如先按欄位 1 升序,相同則按欄位 2 升序)。

qsort 比較函數範本

struct Record { int field1; int field2; /* ... */ };

int cmp(const void* a, const void* b) {
    const Record* pa = (const Record*)a;
    const Record* pb = (const Record*)b;
    if (pa->field1 != pb->field1)
        return pa->field1 - pb->field1;          // 主鍵
    return pa->field2 - pb->field2;              // 次鍵
}

// 使用
qsort(arr, n, sizeof(Record), cmp);

進階:泛型比較器 (C++11 lambda + std::sort)

現代 C++ 推薦 std::sort,型別安全且效能更好:

std::sort(vec.begin(), vec.end(),
    [](const Record& a, const Record& b) {
        if (a.field1 != b.field1) return a.field1 < b.field1;
        return a.field2 < b.field2;
    });

注意事項

  • 減法比較可能溢位(極大值減極小值),安全寫法:(a > b) - (a < b) 或三元運算子。
  • 多鍵值可鏈式擴展:return a.f1 != b.f1 ? a.f1 - b.f1 : (a.f2 != b.f2 ? a.f2 - b.f2 : a.f3 - b.f3);
  • 若需降序,調換回傳值或改用 std::greater。

總結

C 風格用 qsort + 比較函數指標;C++ 推薦 std::sort + lambda,語法更清晰、型別安全、內聯優化效能更高。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved