2016-05-22 3 views
0

私は部分的に塗りつぶされた配列を持っています。部分的に塗りつぶされたC++の動的配列

基本的に、アレイは次のように動作します。容量に達すると、配列が2倍とサイズになり、すべての要素が新しい要素に追加されたときに、次の使用可能な空き領域に整数が追加されます。

  +---+---+---+---+ 
elementData | 6 | 2 | 4 | | 
      +---+---+---+---+ 

      +---+  +---+ 
    capacity | 4 | size | 3 | 
      +---+  +---+ 

このように作成されました。

int ar[5] = {6, 2, 4, 7, 3}; 
PFArray pf; 

cout << "==== Test addElement() ===\n"; 

for (int i = 0; i < 5; ++i) { 
    cout << "Insert " << ar[i] << ": "; 
    pf.addElement(ar[i]); 
    displayResult(pf); 
} 

私が書こうとしたこの機能は、このようになります。

void PFArray::addElement(int elt) 
{ 
    if (size == capacity) 
    { 
     int *resized = new int[size*2]; 
     capacity = size*2; 
     for (int i = 0; i < size; i++) 
      resized[i] = elementData[i]; 
     elementData = resized; 
     delete [] resized; 
    } 
    elementData[size++] = elt; 
} 

私は2つのエラーに遭遇しています。 1つは、各行の先頭に0が配列に追加されています。

==== Test addElement() === 
Insert 6: [0,6,] -- size=2, capacity=2 
Insert 2: [0,6,2,] -- size=3, capacity=4 
Insert 4: [0,6,2,4,] -- size=4, capacity=4 
Insert 7: [0,6,2,4,7,] -- size=5, capacity=8 
Insert 3: [0,6,2,4,7,3,] -- size=6, capacity=8 

つ、私はラインelementData[size++] = elt;にエラーEXC_BAD_ACCESSを取得しています。

私が間違っていることを誰かが指摘できたら、それは非常に感謝しています。参考までに、私は言語としてC++にかなり新しいです。

addElement()の動作は次のとおりです。

新しい要素eltを配列の次の空きスロットに挿入します。現在の配列がその容量に達した場合、古い配列の容量の2倍の配列のコピーが作成され、新しい要素が新しい配列に挿入されます。あなたは、新しい配列を指すようにelementDataを作成します(もちろん)。しかし、メモリリークを避けるために古い配列を削除する必要があります。また、容量とサイズを適切に設定する必要があります。

私は関連性があると思われるすべてのコードを含めるようにしましたが、もっと提供する必要がある場合は、私も満足しています。

P.S.私はベクトルを認識していますが、私がやろうとしていることに対してこの方法論を使用したいと思います。そこ

+0

あなたの目的は、 'std :: vector'を使って、サイズや容量などを管理する時間を無駄にしないでください。 –

+0

@SteveFallowsはこの記事を編集しました。残念ながら私は使用できませんベクトル。 – 23k

答えて

3
elementData = resized; 
delete [] resized; 

、あなたはelementDataに割り当てられた配列を削除したし、その後、あなたはそれに書き込む:

elementData[size++] = elt; 
1

Zdeslavが言うように、あなたが削除した配列に書き込みます。正しい方法は次のとおりです。

delete [] elementData; 
elementData = resized; 

最初のエラーはdisplayResult()コードにあるようですが、コードは含まれていません。

関連する問題