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

自製 C++ 排序函數模板:支援 MFC 集合與雙向排序的輕量方案

     編輯:關於C++

在 MFC 專案開發中,常需對 CStringArray、CArray 等集合類別進行排序。雖然 STL std::sort 功能強大,但存在兩大痛點:

  1. 迭代器不相容:MFC 集合未提供 STL 風格迭代器,雖可透過 GetData() 取得指標繞過封裝,但違反物件導向原則。
  2. 降序排序繁瑣:需額外撰寫比較函數或仿函數,增加樣板程式碼。

為此設計一個輕量級排序函數模板 BubbleSort,採用氣泡排序演算法,雖非最佳時間複雜度,但對中小型資料集足夠實用,並完美支援 C++ 陣列與 MFC 集合。

模板介面設計

template <typename COLLECTION_TYPE, typename ELEMENT_TYPE>
void BubbleSort(COLLECTION_TYPE& collection, ELEMENT_TYPE element, int count, bool ascend = true)

參數說明:

  • collection:支援 operator[] 的集合物件(C++ 陣列、CArray、CStringArray 等)
  • element:僅用於推導元素型別,建議傳入 collection[0]
  • count:元素個數
  • ascend:true 升序(預設),false 降序

核心實作邏輯

for (int i = 0; i < count-1; i++)
    for (int j = 0; j < count-1-i; j++)
        if (ascend) {
            if (collection[j] > collection[j+1]) swap(...);  // 升序
        } else {
            if (collection[j] < collection[j+1]) swap(...);  // 降序
        }

透過 ascend 旗標控制比較方向,單一函數滿足雙向排序需求,無需額外比較函數。

多樣化使用範例

// C++ int 陣列升序
int arr[] = {45, 23, 76, 91, 37, 201, 187};
BubbleSort(arr, arr[0], 7);

// CArray<int> 升序
CArray<int, int> coll;
coll.Add(45); coll.Add(23); ... 
BubbleSort(coll, coll[0], coll.GetSize());

// CString 陣列降序
CString strArr[] = {"eagle", "hawk", "falcon"};
BubbleSort(strArr, strArr[0], 3, false);

// CStringArray 降序
CStringArray strColl;
strColl.Add("eagle"); strColl.Add("hawk"); ...
BubbleSort(strColl, strColl[0], strColl.GetSize(), false);

適用性與擴展建議

  • 優點:零依賴、不破壞封裝、介面簡潔、支援 MFC 原生集合。
  • 限制:氣泡排序 O(n²) 複雜度,僅適合中小資料量(<1000 元素);大資料集建議轉 STL 容器使用 std::sort。
  • 擴展方向:可改為插入排序、快速排序;支援自訂比較仿函數;增加隨機存取迭代器版本對接 STL。

這個自製模板展示了「恰到好處」的工程思維:不追求大而全,精準解決特定場景痛點,是 MFC 專案中實用的排序利器。

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