我有一个列大小为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;
}
答案 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。