2016-11-16 14 views
-4

私はC++でいくつかのコードを書いています。クイックソートアルゴリズムを使って整数の配列をソートします。私はここに完全なコードを持っています:QuickSort in C++ array.size()エラー

void swap(int A[], int x, int y) 
{ 
    int tmp; 
    tmp=A[x]; 
    A[x]=A[y]; 
    A[y]=tmp; 
} 

int partition(int A[], int start, int stop) 
{ 
    int big=start; 
    int pivot=A[stop]; 
    for(int i=start; i<stop; i++) 
    { 
     if(A[i]<=pivot) 
     { 
      swap(A, i, big); 
      big++; 
     } 
    } 
    swap(A, big, stop); 
    return big; 
} 


void quick_Sort_Helper(int A[], int start, int stop) 
{ 
    //base cases 
    if(stop<=start) 
    {return;} 

    if(start+1==stop) 
{ 
    if(A[start]>A[stop]) 
    {swap(A, start, stop);} 
    return; 
} 

//recursive cases 
int pivot=partition(A,start, stop); 
quick_Sort_Helper(A,start, pivot-1); 
quick_Sort_Helper(A, pivot, stop); 
} 

void quick_Sort(int A[]) 
{ 
    quick_Sort_Helper(A,0, A.size()-1); 
} 

私はA.size()と呼ばれる行でプログラムをコンパイルするとエラーが発生します。以下のようにエラーが読み込ま:

エラー:私はのためにサイズ()機能を理解していない非クラス型である「A」のメンバー「サイズ」、「int型*」

の要求配列は、配列内の要素の長さ/数を持つ整数を返すと想定されます。

+1

いいえ、配列には 'size()'関数がありません。彼らは決してしなかった。決して。これはJavaではなくC++です。 –

+2

>配列のsize()関数は配列内の要素の長さ/長さの整数を返すはずなので、わかりません。 あなたはどこにいるのか分かりません.... – mascoj

+0

なぜ私はすべての下降声が、私には妥当な質問のように見えますが、十分な詳細があり、おそらくGoogleで検索するのが最も簡単なことではありません。 – Jonathan

答えて

1

配列にはメソッドがありません。したがって、この式A.size()-1は無効です。配列の要素数を関数に明示的に渡す必要があります。したがって、関数宣言はnが配列A内の要素の数である

void quick_Sort(int A[], size_t n); 

ようになります。

1

Javaとは異なり、C++の配列はクラスではありません。配列をクラスとして使用する場合は、配列クラスを使用できます。

array<int,5> A; 

Reference to Array class C++


アレイは第二級市民であり、それらがポインタに減衰するので、あなたは直接のC++関数に配列を渡すことができません。それでも配列を渡したい場合は、パラメータとしてサイズを渡すことはできません。


あなたはそれのサイズを求めるのと同じスコープで配列を宣言した場合、あなたはこれを行うことができ、C++では

int l = sizeof(A)/sizeof(A[0]); 
1

、配列はいかなる機能が付属していません。それは文字通り、(あなたの場合はsizeof(int)* numberOfItemsである)宣言されているデータを保持するのに十分なだけの連続したメモリのブロックです。

代わりにstd :: vectorを使用するように移動することをお勧めします(この場合、std :: vector < int>)。これは、フードの下で配列を管理しますが、size()関数、ランダムアクセス、自動サイズ変更など

また、このような配列を直接使用する場合は、その長さに沿って配列上で操作する関数に渡す必要があります。それ以外の場合、関数は配列のサイズを知ることができません。

2

生の配列はかなりダムです。彼らはサポート方法のないメモリブロックです。さらに、あなたがそれらを渡すとき、彼らは持っていた小さなメタ情報を失う傾向があります。decay to pointers。この情報を保持する必要がある場合は、std::vector (resizable)またはstd::array (static size)を使用することを検討してください。

何らかの理由でこれらを使用できない場合は、サイジング情報を配列に含めて構造体を渡す単純なラッピング構造を作成することを検討してください。