如果您要读取或修改矩阵的位置,那没关系,但是您要修改矩阵本身。在您的示例中,您需要创建另一个矩阵。
已编辑:由于 cmets,我已将其修改为使用 unique_ptr(尽管我认为 OP 并没有真正准备好/对此感兴趣)。
已编辑我知道您可以“就地”转置矩阵。然而,这不是 OP 的问题。感谢所有对此发表评论的人。
std::unique_ptr<> 是一个让你管理指针的类,保证你使用后指针会被自动删除。一个选项是auto_ptr。不幸的是,它不支持数组向量。 unique_ptr 确实支持它们,尽管它是新标准 c++-0x 的一部分。
所以,需要将transpose的形参修改为:
void transpose(std::unique_ptr<float**> &array, int rows, int columns)
{
std::unique_ptr<float **> aux = array;
array.reset( new float[columns][rows] );
// now transpose aux into array
}
这也意味着您不能像以前那样创建原始数组:
float array[5][4];
这是一个栈上的矩阵,你不能指望修改指针本身,它没有意义。如果你这样做更好:
int main()
{
std::unique_ptr<float **>array( new float[5][4] );
transpose( array, 5, 4 );
// ... use array ...
}
也就是说,另一种解决方案是稍微改变转置过程的签名,并使其成为一个函数。
std::unique_ptr<float **> transpose(float** array, int rows, int columns)
{
std::unique_ptr<float **> toret( new float[columns][rows] );
// now transpose array into toret
// end
return toret;
}
.. 并且您不需要更改程序中的任何其他内容。
int main()
{
float array[5][4];
std::unique_ptr<float **> transposed( transpose( array, 5, 4 ) );
// ... more things ...
}