MST

星途 面试题库

面试题:C++数组作为函数参数在模板函数中的类型转换

编写一个模板函数,该函数可以接收不同类型的数组作为参数,并对数组进行排序。在模板函数中,要处理好数组作为参数时的类型转换问题,确保函数能正确处理不同维度的数组(例如一维数组和二维数组)。请阐述你在实现过程中是如何应对类型转换以及不同维度数组处理的。
22.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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;
}

类型转换及不同维度数组处理说明

  1. 类型转换:在模板函数参数中使用引用 (&),避免了数组退化为指针带来的信息丢失,从而能够获取数组的维度信息。这样编译器可以根据数组的实际类型(包含维度信息)来实例化合适的模板函数,无需手动进行类型转换。
  2. 一维数组处理:对于一维数组模板函数 sortArray(T (&arr)[N]),直接使用 std::sort 对整个数组进行排序,std::sort 的前两个参数分别是数组起始地址和结束地址,这里 arr 是数组起始地址,arr + N 是结束地址(不包含该地址元素)。
  3. 二维数组处理:对于二维数组模板函数 sortArray(T (&arr)[M][N]),通过外层循环遍历每一行,对于每一行,同样使用 std::sort 进行排序,这样实现了对二维数组每一行的排序。每一行的起始地址为 arr[i],结束地址为 arr[i] + N