我创建了一个水平翻转方形2d数组的函数,因此第一行移动到最后一行,第二行移动到最后一行,依此类推。
这是功能:
void flipMatrix(int size, int matrix[ROWS][COLS]) {
int row, col;
int temp[ROWS][COLS];
for (row=0; row < size; row++) {
for (col=0; col < size; col++) {
temp[(size - 1)-row][col] = matrix[row][col];
}
}
//A simple function that copies the temp array to matrix, so that
//I can then print the matrix array
copyArray(size, matrix, temp);
}
我知道这是非常低效的,但我对C ++很陌生。我想知道如何通过返回指针来调整它以提高效率?我也想知道是否有办法在不创建临时数组的情况下执行此操作?
我还应该注意,我试图在不使用STL的情况下这样做。
感谢您的帮助。
答案 0 :(得分:3)
您可以使用std::swap
并只是就地交换值:
void flipMatrix(int size, int matrix[ROWS][COLS])
{
for (int row = 0; row < ROWS; ++row)
{
for (col=0; col < COLS / 2; ++col) // half the column, lest you undo it
{
std::swap(matrix[ROWS - row - 1][col], matrix[row][col]);
}
}
}
交换在<algorithm>
中定义。如果你真的不能使用STL,交换很简单就可以实现:
template <typename T>
void swap(T& pA, T& pB)
{
T temp = pA;
pA = pB;
pB = temp;
}
答案 1 :(得分:1)
如果您可以使用不同的数据结构来表示矩阵,则可以在不使用STL的情况下获得更高效的算法。
例如,考虑使用指向数组列表的指针数组,每个数组表示一个矩阵行。使用此数据结构,您只需要在第一个数组中交换指针,而不需要触及数组列表中的项目。
答案 2 :(得分:0)
将值复制回矩阵不会将值复制回flipMatrix
的调用者,因为已知大小的数组(此处为ROWS x COLS
)按值传递:
void copyReverse(int a[4]) { ... }
void refReverse(int a[], int size) { ... }
int a[4] = { 1, 2, 3, 4 };
copyReverse(a);
// a = { 1, 2, 3, 4 } still.
refReverse(a, 4); // Doesn't know size from type
// a = { 4, 3, 2, 1 }
因此,结合GMan的答案,扩大交换:
void flipMatrix(int size, int matrix[][])
{
for (int row = 0; row < size; ++row)
{
for (col=0; col < size / 2; ++col)
{
int temp = matrix[size - row - 1][col];
matrix[size - row - 1][col] = matrix[row][col];
matrix[row][col] = temp;
}
}
}