2016-12-11 4 views
-1

私はポインタとして動的に割り当てられた配列を持つC++構造体を持っています。配列を逆にする関数がありますが、動作していないようです(一時変数が元の値を指していると思います)。デリバリングメンバポインタ

struct s { 

    int *array; 
    int length; 

    ... 

    s(int n) { 
     this->array = new int[n]; 
     this->length = n; 
    } 

    ... 

    void reverse() { 

     for (int i = 0; i < this->length; i++) { 
      int n = this->array[i]; 
      this->array[i] = this->array[this->length - i - 1]; 
      this->array[this->length - i - 1] = n; 
     } 

    } 

    ... 

} 

私はそのための配列が同じままで、逆転されない何これがやっていることはthis->array[this->length - i - 1] = this->array[i] だと思います。私は配列ポインタを尊重する方法や、ちょうどnの中でthis->array[i]の値を取る方法を知らない。

+0

ロジックは逆になります。 at i = 0の場合、配列[n-1]を配列[0]に配置します.i = n-1で配列[0]を配列[n-1]に配置します。 –

+0

私はforループの最初の部分は、配列の最初の半分が正しいと思うが、後半の最初の半分の "ミラー"イメージを作ると思います。コードの単純化のために、なぜポインタ配列を2番目の配列に逆順にして再利用するのではなく、どうして? –

+0

今後のいくつかの質問を控えるかもしれないので[3つのルールとは何ですか?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)を読むことをお勧めします。 – user4581301

答えて

4

あなたの逆が動作しない理由は、配列全体の長さを通過しているということです。あなたはその半分だけを通過する必要があります。あなたが後半を通過すると、それを元に戻すことになります。

例として、あなたが[1, 2, 3, 4]を逆転しようとした場合、あなたは

after i = 0: [4, 2, 3, 1] 
after i = 1: [4, 3, 2, 1] 
--- reversed --- 
after i = 2: [4, 2, 3, 1] 
after i = 3: [1, 2, 3, 4] 
--- back to original --- 

を取得する代わりに、ちょうどあなたのループサイドノートで

for (int i = 0; i < this->length/2; i++) { 
    ... 
} 
+0

はい、ありがとう、それは今動作します。 – KSL

0

を行い、2つのインデクサーを使用すると、かなりあなたのコードを簡素化します。

void reverse() 
{ 
    int limit = length/2; 
    for (int front = 0 , back = length - 1; front < limit; front++ , back--) 
    { 
     int n = array[front]; 
     array[front] = array[back]; 
     array[back] = n; 
    } 

}