#include <iostream>
#include <algorithm>
// 一维数组排序模板函数
template<typename T, size_t N>
void sortArray(T (&arr)[N]) {
std::sort(arr, arr + N);
}
// 二维数组排序模板函数
template<typename T, size_t M, size_t N>
void sortArray(T (&arr)[M][N]) {
for (size_t i = 0; i < M; ++i) {
std::sort(arr[i], arr[i] + N);
}
}
int main() {
int oneDimArray[] = {5, 3, 7, 1, 9};
sortArray(oneDimArray);
for (int num : oneDimArray) {
std::cout << num << " ";
}
std::cout << std::endl;
int twoDimArray[3][4] = {
{4, 2, 6, 1},
{9, 7, 5, 3},
{8, 0, 2, 4}
};
sortArray(twoDimArray);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
std::cout << twoDimArray[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
类型转换及不同维度数组处理说明
- 类型转换:在模板函数参数中使用引用
(&)
,避免了数组退化为指针带来的信息丢失,从而能够获取数组的维度信息。这样编译器可以根据数组的实际类型(包含维度信息)来实例化合适的模板函数,无需手动进行类型转换。
- 一维数组处理:对于一维数组模板函数
sortArray(T (&arr)[N])
,直接使用 std::sort
对整个数组进行排序,std::sort
的前两个参数分别是数组起始地址和结束地址,这里 arr
是数组起始地址,arr + N
是结束地址(不包含该地址元素)。
- 二维数组处理:对于二维数组模板函数
sortArray(T (&arr)[M][N])
,通过外层循环遍历每一行,对于每一行,同样使用 std::sort
进行排序,这样实现了对二维数组每一行的排序。每一行的起始地址为 arr[i]
,结束地址为 arr[i] + N
。