2017-10-24 2 views
0

で動的配列を作成できますか私はこの機能を持っている:はどのように私は、CPP

void reverse(int* nums, unsigned int size) 

この機能は、それが取得され、配列内の値を反転することになっています。

逆転のために、私は渡された配列のサイズを持つ別の配列を作成すると考えました。元の配列の最後からこの新しい配列を最初に割り当てます。

しかし、私はC++の新種です。だから、dynamic arrayを関数のパラメータのサイズで作成する方法がわかりません。

+0

'int型*配列=新しいint型[サイズ];' – Raindrop7

+0

は、なぜあなたは二番目の配列が必要なのでしょうか?オリジナルの配列を使用してその位置を元に戻します。 –

+2

動的配列が必要な場合。ただ、[std :: vector](http://en.cppreference.com/w/cpp/container/vector)を使用してください。 –

答えて

2

実際にはここで新しい配列を割り当てる必要はありません。既存の要素をその場で並べ替えるだけでこの問題を解決する方法が見つかるかどうかを確認してください。しかし、この

delete[] auxiliaryArray; 

を書き込むことによって

int* auxiliaryArray = new int[size]; 

は、あなたがそれを解放したい:

は、それがポインタと運動だように、これはあなたが new[]演算子を使用してスペースを割り当てることができ、思われることを考えるとC++でこれを行うための好ましい方法ではありません。より良い方法は、すべてのメモリ管理を行う std::vectorを使用することです。これは次のようになります。

std::vector<int> auxSpace(size); 

実際の配列と同じように、角かっこを使用して要素にアクセスできます。これを行うには、プログラムの先頭に#include <vector>が必要です。

C++で
0

、可変サイズの配列を作成するための推奨方法は、のstd ::ベクトル

#include <vector> 
void reverse(int* nums, unsigned int size) 
{ 
    std::vector<int> V(size); 
    ... 
} 

を用いることであろう。しかし、それはへの追加のメモリを必要とするため、そのアプローチは、ここでは、パフォーマンスのために最善ではありません配列のサイズを割り当てることができますが、それは大きくなる可能性があります。配列の外側から開始し、ミラーリング位置にあるメンバーを1つずつスワップする方が良いでしょう(サイズが5の場合は0と4を入れ替え、1と3を入れ替えて2を残してください)。これは、単一のintを一時的に格納するだけで済みます。

+1

Askerが 'vector'を使うことができるなら' std :: reverse'を使うかもしれません – user4581301

+0

しかし、ベクトルを使った場合、次に、入力配列内のすべてに逆順を適用します。なぜなら、署名はインプレース修正のためです。ベクトルをまったく使用しないことをお勧めします。 – idontseethepoint

0

あなたは別の配列を作成しなくても、それを行うことができます:n-1の要素を持つあなたが最初の要素だけを交換する必要がループ内で上記の見ることができるように

void reverse(int* array, const int size){ 
    for(int i = 0; i < size/2; i++){ 
     int tmp = array[i]; 
     array[i] = array[size - 1 - i]; 
     array[size - 1 - i] = tmp; 
    } 
} 


int main(){ 
    int array[] = {1, 3, 5, 7, 9, 11}; 
    const int size = sizeof(array)/sizeof(array[0]); 
    reverse(array, size); 

    for(int i(0); i < size; i++) 
     std::cout << array[i] << ", "; 

} 

を(要素0)と2番目はn-1-1と息子...

0からn-1にインデックスが付けられています。

あなたは実用的ではない新しい配列割り当てたい場合は:あなたはあなたができる新しい配列を使用したい場合は

int* reverse2(int* array, const int size){ 
    int* tmp = new int[size]; 

    for(int i(size - 1), j(0); j < size; j++, i--) 
     tmp[j] = array[i]; 

     return tmp; 
} 


int main(){ 

    int array[] = {1, 3, 5, 7, 9, 11}; 

    for(int i(0); i < size; i++) 
     std::cout << array[i] << ", "; 

    std::cout << std::endl; 

    int* newArray = reverse2(array, size); 
    for(int i(0) ; i < size; i++) 
     std::cout << newArray[i] << ", "; 

    std::cout << std::endl; 

    delete[] newArray; 

    return 0; 
} 
0

を、私は大砲でハエを殺すことだと思います。

  1. C++ではなくプレーンなCコードを使用しているようです。私は、関数の署名のためにそれを言う。

    void reverse(std::vector& items);

  2. あなたは現在のものを使用して、新しい配列せずに現在の配列を逆にすることができます:一般的なC++コード内の関数のシグネチャは、この他のようなものである可能性があります。ポインタを配列の最初の項目に渡していますが、コンテンツは変更できないように定数ではありません。機能のためのより良いシグネチャは次のようになります。

    void reverse(int* const nums, const unsigned int size);

  3. ポインタの問題のように見えます。配列の位置を反復する境界について考えてみましょう。配列全体を反復処理する必要がありますか?たぶん半分の配列ですか? ;)

  4. ボーナストラックとしては、無関係の変数を使わずに値を交換するのはどうですか? (これは、この場合、基本型int ...バイナリ算術を覚えているということです)。


array[pos_head] ^= array[pos_tail]; 
array[pos_tail] ^= array[pos_head]; 
array[pos_head] ^= array[pos_tail];