2017-02-12 113 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 ] ;