首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 利用 std::sort 對 vector 結構體排序完整範例(升序/降序/自訂比較)

     編輯:關於C語言

基本用法

std::sort (需含 ``) 接受迭代器範圍與可呼叫比較物,對 vector 進行原地排序,平均複雜度 O(N log N)。

結構體定義與比較函式

struct AssessTypeInfo {
    unsigned int m_uiType;   // 類型 ID
    char m_szName[64];       // 類型名稱
    unsigned int m_uiTotal;  // 總分數
};

// 升序:依 m_uiType 由小到大
bool lessmark(const AssessTypeInfo &s1, const AssessTypeInfo &s2) {
    return s1.m_uiType < s2.m_uiType;
}

// 降序:依 m_uiType 由大到小
bool greatermark(const AssessTypeInfo &s1, const AssessTypeInfo &s2) {
    return s1.m_uiType > s2.m_uiType;
}

完整程式範例

#include <vector>
#include <algorithm>
#include <cstdio>

using namespace std;

int main() {
    vector<AssessTypeInfo> ctn;
    AssessTypeInfo a1 = {1}, a2 = {2}, a3 = {3};
    ctn.push_back(a1); ctn.push_back(a2); ctn.push_back(a3);

    // 升序
    sort(ctn.begin(), ctn.end(), lessmark);
    for (int i = 0; i < 3; ++i) printf("%d\n", ctn[i].m_uiType); // 1 2 3

    // 降序
    sort(ctn.begin(), ctn.end(), greatermark);
    for (int i = 0; i < 3; ++i) printf("%d\n", ctn[i].m_uiType); // 3 2 1

    return 0;
}

進階比較方式 (C++11/14/17)

  1. Lambda 表達式 (就地定義,最常用):
    sort(v.begin(), v.end(), [](const A& a, const A& b){ return a.key < b.key; });
  2. 仿函數 (Functor):定義 operator() 的結構體,可攜帶狀態。
    struct ByName { bool operator()(const A& a, const A& b) const { return strcmp(a.name, b.name) < 0; } };
  3. std::function:型別擦除,可儲存任意可呼叫物,略有效能開銷。
  4. 多鍵值排序:
    sort(v.begin(), v.end(), [](const A& a, const A& b){ return tie(a.key1, a.key2) < tie(b.key1, b.key2); }); (需 ``)。

效能與穩定性提醒

  • std::sort 不保證穩定 (相等元素相對順序可能改變),需穩定排序請用 std::stable_sort。
  • 對於小型結構體 (如僅含整數),傳值比較可能比傳參考更快;大型物件必須傳 const&。
  • 比較函式必須嚴格弱序 (Strict Weak Ordering),否則行為未定義。

現代 C++ 最佳實踐

優先使用 Lambda + 範圍-based for + 結構化綁定 (C++17) 撰寫清晰、高效的排序邏輯;避免舊式函數指標與全域比較函數。

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