c ++中函数的2d数组转换无效

时间:2017-02-12 14:07:56

标签: c++

我有一个列大小为2且行大小为x的二维数组。我想根据每行第1列的值进行插入排序。所以如果给定的数组是[[2,3],[4,1],[5,6],[1,6]],我的输出数组将是[[1,6],[2,3],[ 4,1],[5,6]]。我为此编写了C ++函数。但是当我试图返回数组时出现问题。并且它说"从int(*)[2]到int&#34的无效转换; 。由于我在C ++方面不是很有经验,所以我不知道如何解决这个问题以及为什么会这样做。这就是我的功能:

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;
}

2 个答案:

答案 0 :(得分:1)

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

arr具有类型为“大小为2的int数组的数组”,可以将其转换为指向大小为2的数组的指针。函数返回指向int的指针。

顺便说一下,如果你想要没有别名的完整声明,那就有一个语法:

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

答案 1 :(得分:1)

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

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

int[2]可能是也可能不是整个int[2]数组的开头。

实际上,该功能完全等同于:

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 ++中创建矩阵数据类型的想法,请搜索Stack Overflow。