2017-02-12 13 views
-1

2次元配列の列サイズが2で行サイズがxです。私は、各行の第1列の値に基づいて挿入ソートを行いたい。したがって、指定された配列が[[2,3]、[4,1]、[5,6]、[1,6]]の場合、出力配列は[[1,6]、[2,3] 4,1]、[5,6]]。私はこのためにC++関数を書いています。しかし、私は配列を返そうとしているときに問題があります。そして、 "int(*)[2]からintへの無効な変換"と言っています。私は非常にCで経験したわけではないとして++私はこの問題を解決する方法がわからない、なぜこれがcause.Hereある私の関数である。2d配列の変換が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

参照と 'std :: vector'を使わない理由を教えてください –

+1

なぜこの関数からarrが返されていますか?あなたはすでに非const入力パラメータとしてそれを変更しています –

+0

ベクトルは良い解決策ですか?コードはプログラミング上の課題に使用され、私はメモリ効率を考慮しているので –

答えて

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

arrは、いくつかのint[2]へのポインタです。

そのint[2]は、int[2]の配列全体の始まりであっても、そうでなくてもよい。実際に

、機能は完全に等価です:だからarrのタイプはint(*)[2]ある

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

。戻り値の型はint*です。これらの2つのポインタ型は、非常に異なるものを指しているため互換性がないため、エラーメッセージが表示されます。


エレガントな修正が再び複雑なタイプを綴ることなく、戻り値の型がarrの型と同じになるように、auto戻り値の型を使用することです:

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、プロファイラを使用してパフォーマンスのボトルネックを見つけます。そのような質問をする前に少なくともcppreferenceを読んでください。それはcppに潜入するより効率的な方法です。 –

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 ] ; 
関連する問題