MST

星途 面试题库

面试题:C++函数模板非类型参数在复杂场景下的限制分析

假设我们有一个表示矩阵操作的函数模板,它的非类型参数用于指定矩阵的行数和列数。代码如下: ```cpp #include <iostream> // 函数模板声明 template <typename T, int rows, int cols> void matrixMultiply(T matrixA[rows][cols], T matrixB[cols][rows], T result[rows][rows]) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < rows; ++j) { result[i][j] = 0; for (int k = 0; k < cols; ++k) { result[i][j] += matrixA[i][k] * matrixB[k][j]; } } } } int main() { int matrix1[2][3] = {{1, 2, 3}, {4, 5, 6}}; int matrix2[3][2] = {{7, 8}, {9, 10}, {11, 12}}; int result[2][2]; matrixMultiply<int, 2, 3>(matrix1, matrix2, result); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { std::cout << result[i][j] << " "; } std::cout << std::endl; } return 0; } ``` 如果我们想扩展这个功能,让矩阵的行数和列数可以在运行时动态输入(通过用户输入或者从文件读取),在考虑到函数模板非类型参数的使用限制下,应该如何修改代码?请详细说明思路并给出修改后的代码框架。
24.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 思路
    • 函数模板的非类型参数必须在编译期确定,而要实现运行时动态输入矩阵的行数和列数,不能再使用非类型参数来表示矩阵的维度。
    • 可以使用动态内存分配来创建矩阵,比如使用std::vector或者newdelete来手动管理内存。这里以std::vector为例,它能动态调整大小,适应运行时输入的行数和列数。
    • 函数参数也需要相应调整,不再使用固定维度的数组作为参数,而是使用std::vector
  2. 修改后的代码框架
#include <iostream>
#include <vector>

// 函数声明
void matrixMultiply(const std::vector<std::vector<int>>& matrixA, const std::vector<std::vector<int>>& matrixB, std::vector<std::vector<int>>& result) {
    int rowsA = matrixA.size();
    int colsA = matrixA[0].size();
    int colsB = matrixB[0].size();

    for (int i = 0; i < rowsA; ++i) {
        for (int j = 0; j < colsB; ++j) {
            result[i][j] = 0;
            for (int k = 0; k < colsA; ++k) {
                result[i][j] += matrixA[i][k] * matrixB[k][j];
            }
        }
    }
}

int main() {
    int rowsA, colsA, rowsB, colsB;
    std::cout << "请输入矩阵A的行数和列数: ";
    std::cin >> rowsA >> colsA;
    std::cout << "请输入矩阵B的行数和列数: ";
    std::cin >> rowsB >> colsB;

    if (colsA != rowsB) {
        std::cout << "矩阵维度不匹配,无法相乘。" << std::endl;
        return 1;
    }

    std::vector<std::vector<int>> matrix1(rowsA, std::vector<int>(colsA));
    std::vector<std::vector<int>> matrix2(rowsB, std::vector<int>(colsB));
    std::vector<std::vector<int>> result(rowsA, std::vector<int>(colsB));

    std::cout << "请输入矩阵A的元素: " << std::endl;
    for (int i = 0; i < rowsA; ++i) {
        for (int j = 0; j < colsA; ++j) {
            std::cin >> matrix1[i][j];
        }
    }

    std::cout << "请输入矩阵B的元素: " << std::endl;
    for (int i = 0; i < rowsB; ++i) {
        for (int j = 0; j < colsB; ++j) {
            std::cin >> matrix2[i][j];
        }
    }

    matrixMultiply(matrix1, matrix2, result);

    std::cout << "结果矩阵: " << std::endl;
    for (int i = 0; i < rowsA; ++i) {
        for (int j = 0; j < colsB; ++j) {
            std::cout << result[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

上述代码实现了运行时动态输入矩阵的行数和列数,并进行矩阵乘法运算。通过std::vector来管理动态大小的矩阵,函数matrixMultiply的参数也相应修改为std::vector类型。在main函数中,先获取用户输入的矩阵维度,创建相应大小的矩阵,再获取矩阵元素,执行乘法运算并输出结果。