2017-02-12 57 views
-1

我有一个列大小为2,行大小为x的2d数组。我想根据每行的第一列的值进行插入排序。所以如果给定的数组是[[2,3],[4,1],[5,6],[1,6]]我的输出数组将是[[1,6],[2,3],[ 4,1],[5,6]]。我已经为此编写了C++函数。但是当我试图返回数组时,有一个问题。它说“从int(*)[2]到int的无效转换”。因为我不是很用C++经验,我不知道如何解决这个问题,为什么这是cause.Here是我的功能:从C++中的函数转换为2d数组无效无效

int* Insertion(int arr[][2],int x) 
{ 
    for(int i=0;i<x;i++) 
    { 
     for(int j=i;j>0;j--) 
     { 
      if(arr[j][0]<arr[j-1][0]) 
      { 
       int temp1=arr [j][0]; 
       int temp2=arr [j][1]; 
       arr [j][0]=arr[j-1][0]; 
       arr[j][1]=arr[j-1][1]; 
       arr[j-1][0]=temp1; 
       arr[j-1][1]=temp2; 
      } 
     } 
    } 
    return arr; 
} 
+0

请告诉我为什么你不使用引用和'std :: vector' –

+1

你为什么要从这个函数返回arr?你已经改变它作为一个非常量输入参数 –

+0

矢量是一个很好的解决方案?因为代码将用于编程挑战,我正在考虑内存效率 –

回答

1
int* Insertion(int arr[][2],int x) 

arr是一个指针指向一些int[2]

int[2]可能会也可能不是整个int[2] s的阵列的开始。

事实上,功能完全等同于:

int* Insertion(int (*arr)[2],int x) 

所以arr类型是int(*)[2]。返回类型是int*。这两种指针类型不兼容,因为它们指向非常不同的东西,因此是错误消息。


优雅的解决将是使用auto返回类型,所以返回类型是一样的arr类型,而不必拼出再复杂类型:

auto Insertion(int arr[][2],int x) -> decltype(arr) 

的更优雅的修复将是摆脱所有这些指针废话并使用大小为x * y的std::vector来存储数据。搜索堆栈溢出了解如何在C++中创建矩阵数据类型的想法。

+0

如果考虑内存效率将向量是一个很好的解决方案?谢谢你的方式:) –

+1

@NazmusSalehin:你期望什么样的问题?您当前的解决方案还需要将数组*存储在某处*。我想它通过'new []'从免费商店分配内存,这已经是一件坏事了。 'std :: vector'也可以从免费商店分配,但它可以安全地进行分配。相反,如果你的当前数组不是动态的,那么你可以使用'std :: array'来达到同样的效果。无论如何,在你有一个工作解决方案之前,不要进行优化。 –

+0

@Nazmus Salehin,使用分析器查找性能瓶颈。并且在提出这些问题之前至少阅读参考文献;这是潜入cpp的更有效的方式。 –

1
using type = int [ 2 ] ; 
type * Insertion(int arr[][2],int x) { return arr ; } 

改编的类型是“尺寸2的INT数组的数组”,它可以转换为指向2号数组的指针。你的函数返回一个指向int的指针。


顺便说一句,如果你想完整声明没有别名,有语法:

int (* Insertion(int arr[][ 2 ] , int x))[ 2 ] ;