【问题标题】:pass two dimensional array to a method C++ [duplicate]将二维数组传递给方法 C++ [重复]
【发布时间】:2011-11-15 16:13:31
【问题描述】:

可能重复:
How do I use arrays in C++?

我不确定如何在 C++ 中执行此操作:

main()
{
   float array[5][4];   

   transpose(array); 
}

void transpose(float** array);

=> 我遇到了一些编译错误:vector<KeypointMatch, std::allocator<KeypointMatch> >

如何将二维数组的变量传递给 C++ 中的方法?

提前致谢。

【问题讨论】:

  • 浮点数**数组;正在工作...,为什么?
  • 您粘贴的“错误”引用了您发布的代码中没有的类型。
  • 您的错误表明您正在使用矢量 类,在您的代码中找不到该类...
  • @devn:这行得通,因为这是您的示例代码中的 array 类型。

标签: c++


【解决方案1】:

如果您要读取或修改矩阵的位置,那没关系,但是您要修改矩阵本身。在您的示例中,您需要创建另一个矩阵。

已编辑:由于 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 ...
}

【讨论】:

  • 这使用裸指针来管理资源,因此是不安全的。如果标记为“现在将辅助转换为数组”的部分由于某种原因抛出,则会泄漏。 -1来自我。
  • 我也是-1,原因与@sbi and 相同,因为您实际上可以就地转置矩阵。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 2013-01-18
  • 2013-03-28
  • 1970-01-01
  • 2023-03-16
  • 2021-01-07
  • 2021-05-10
相关资源
最近更新 更多