矩阵类模板(类模板)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
设计一个矩阵类模板Matrix,支持任意数据类型的数据。
要求至少包含2个成员函数:矩阵转置函数transport、以及打印输出函数print
编写main函数进行测试,调用类的成员函数完成转置和输出。
输入
第一行先输入t,表示有t个测试用例
从第二行开始输入每个测试用例的数据。
首先输入数据类型,I表示int,D表示double,C表示char,接着输入两个参数m和n,分别表示矩阵的行和列
接下来输入矩阵的元素,一共m行,每行n个数据
输出
输出转置后的矩阵
样例输入
1 2 3 4 5 6 7 8 | 2 I 2 3 1 2 3 4 5 6 C 3 3 a b c d e f g h i |
样例输出
1 2 3 4 5 6 | 1 4 2 5 3 6 a d g b e h c f i |
提示
解决方案
冷静思考就能解决。
看到有同学重载[]
运算符时返回了一个指向了T的指针(即T *
)。这样的话,访问元素时,第二个[]
就是在索引数组了。虽然可以做到是对的,但是我总觉得很别扭,大概是我觉得不应该直接去操作class中private的成员吧...个人觉得还好的方案就是下面这种返回结构体的,或是封装一下std::vector<std::vector<T> >
也都还好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <iostream> template<typename T> class Matrix { public: Matrix(size_t row, size_t col) : row(row), col(col) { data = new T *[row]; for (size_t i = 0; i < row; ++i) { data[i] = new T[col]; } } void setFromCin() { for (size_t ir = 0; ir < row; ++ir) { for (size_t ic = 0; ic < col; ++ic) { std::cin >> data[ir][ic]; } } } void transport() { T **tmp = new T *[col]; for (size_t ir = 0; ir < col; ++ir) { tmp[ir] = new T[row]; } for (size_t ir = 0; ir < col; ++ir) { for (size_t ic = 0; ic < row; ++ic) { tmp[ir][ic] = data[ic][ir]; } } for (size_t ir = 0; ir < row; ++ir) { delete[](data[ir]); } delete[](data); std::swap(row, col); data = tmp; } void println() { for (size_t ir = 0; ir < row; ++ir) { std::cout << data[ir][0]; for (size_t ic = 1; ic < col; ++ic) { std::cout << ' ' << data[ir][ic]; } std::cout << std::endl; } } struct Row &operator[](int index) { return Row(data[index]); } ~Matrix() { for (size_t ir = 0; ir < row; ++ir) { delete[](data[ir]); } delete[](data); } private: int row, col; T **data; struct Row { explicit Row(T *row) : data(row) {} T operator[](int index) { return data[index]; } T *data; }; }; int main() { int T; std::cin >> T; while (T--) { char type; std::cin >> type; int row, col; std::cin >> row >> col; switch (type) { case 'I': { Matrix<int> matrix(row, col); matrix.setFromCin(); matrix.transport(); matrix.println(); break; } case 'D': { Matrix<double> matrix(row, col); matrix.setFromCin(); matrix.transport(); matrix.println(); break; } case 'C': { Matrix<char> matrix(row, col); matrix.setFromCin(); matrix.transport(); matrix.println(); break; } default: ; } } return 0; } |