2009-04-16 8 views
7

私はプログラミングを学んでおり、C++は私の最初の言語です。ポインタを使って私に見せてもらうのをやめて - 私はまだそれらを理解していないので、私はこれに専念する余裕がなくなるまで気にしません。私が割り当てられた初期化後にC++配列のサイズを変更できますか?

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

(私は授業を取っていないよ - ちょうど私を助けて数人の友人と学習)マージソートアルゴリズムを、アルゴリズムが実装説明ではなくて。私はこれを書き換えて、奇数と偶数の両方の整数で使えるようにしたい。私は両方の、後続の配列を反復処理するために同じ整数を使用することができるように

if ((n % 2) != 0) int farray[halfelements + 1]; 

:私はこのコードを追加しようとしました。 sizeof(farray)は16バイト、または4つの整数で表示されています。だからそれはサイズ変更されていません。私が知りたいことは - 初期化した後に配列のサイズを変更することは可能でしょうか?

編集:ベクターを実装するにはどうすればよいですか?反復子をループで使用して反復処理して値をコピーする方法を理解できません。

答えて

16

C++配列のサイズは固定です。

"サイズ変更可能な配列"が必要な場合は、配列の代わりにstd::vectorを使用します。

+0

よろしくお願いいたします。私はstd :: vectorをこのアルゴリズムに実装する方法を理解しました。私のコードをデバッグするのに2時間を費やしたことはないが、私の関数ヘッダー "int mergeSort(std :: vector、int)"を見つけ出すのに "" =/ – jkeys

+0

が欠けていた。とにかく動的配列で?配列またはベクトルを動的にサイズ変更すると、同じパフォーマンスのペナルティが発生する> – Jason

1

配列のサイズを変更する場合は、自動的にサイズを変更できるベクトルを使用することをお勧めします。

4

私のアドバイスはさらに強く:Cスタイルの配列を使用する理由がない限り、std::vector<>(et。al。)を使用してください。あなたはC++を学んでいるので、あなたはそのような理由があるとは思わないでしょう:std::vector<>を使用してください。

+0

ベクトルを使用すると、連続した記憶領域を使用することが保証されます。ポインタを取得するメソッドに渡しても、ベクトルを使用できます。データのサイズを設定するメソッドのポインタへの参照/ポインタを渡すときだけ、生のメモリを使用することに固執します。 – Richard

1

[]演算子は、配列と同じ方法でベクトルに使用できます。 (あなたがより多くのベクトルの方法を使用したい場合)あなたは、このようなベクトル何かでこれを実現することができます。

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

ます。また、ベクトルアクセスに境界チェックを追加する.AT(インデックス)を使用することができます。

if ((n % 2) != 0) int farray[halfelements + 1]; 

それはちょうどあなたの場合と同じです:あなたはif文にカッコを省略すると

:最初のアイデアがコンパイルされますが動作するようには思えなかった理由を知りたい場合は

+0

"pre" HTMLタグをコードに使用しないでください。代わりに、マウスでコードを選択し、ctrl-Kを入力するか、コードアイコンをクリックしてください。 –

+0

彼はベクター(iter、iter)コンストラクタを使用する必要があります。ベクトル farray(originalarray.begin()、&originalarray [half])、sarray(&originalarray [half]、originalarray.end());後でコピーを削除します。しかし、それはおそらく混乱します。 – jmucchiello

0

D「は、それらを使用:

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

だから、作っている 『正しいサイズのfarrayを』 - と、それはすぐにスコープの外に出るとなくなって、あなただけのオリジナル1を残しています。

2

std::vectorもお勧めします。しかし、配列がついている場合は、配列を大きくする必要がある場合は、常にmallocのメモリ、次にreallocを使用できます。

ここでは、mallocreallocについての情報があります。

+0

私もこの規則を使います。 – Hydro

関連する問題