需求分析
- 同一函數名對 整型、浮點型、雙精度型 等數據排序。
- 數據個數 n 未知,需動態確定。
- 使用 函數模板 實現泛型邏輯。
核心代碼實現
#include
#include
#include // std::sort
// 通用排序模板
template
void genericSort(std::vector& arr) {
std::sort(arr.begin(), arr.end(), [](const T& a, const T& b) {
return a < b; // 要求類型支持 operator<
});
}
// 讀取未知長度輸入
template
std::vector readInput() {
std::vector data;
T value;
std::cout << "請輸入數據(非數字結束):";
while (std::cin >> value) {
data.push_back(value);
}
std::cin.clear(); // 清除錯誤狀態
std::cin.ignore(std::numeric_limits::max(), '\n');
return data;
}
int main() {
// 整型排序
auto intVec = readInput();
genericSort(intVec);
std::cout << "整型排序結果:";
for (auto v : intVec) std::cout << v << ' ';
std::cout << '\n';
// 雙精度排序
auto doubleVec = readInput();
genericSort(doubleVec);
std::cout << "雙精度排序結果:";
for (auto v : doubleVec) std::cout << v << ' ';
std::cout << '\n';
return 0;
}
關鍵點解析
- 模板參數推導:編譯器根據實參類型自動實例化
genericSort、genericSort 等。
- 動態容器:使用
std::vector 替代定長數組,自動管理內存、支持任意長度。
- 比較邏輯:Lambda
[](const T& a, const T& b){ return a < b; } 要求類型重載 operator<,內置類型天然支持,自定義結構體需自行重載。
- 輸入終止:非數字輸入觸發
std::cin 失效,配合 clear()/ignore() 恢復流狀態。
進階擴展
- 支持自定義比較器:
template void genericSort(std::vector&, Compare comp)。
- 使用
std::span (C++20) 接受原始數組指針+長度,避免拷貝。
- 並行排序:
std::sort(std::execution::par, ...) 利用多核加速大數據量排序。