2016-11-03 5 views
-2

私は学校の課題に取り組んでおり、ベクターを使用せずに配列のサイズを動的に増やす必要があります。 これは私が持っているものですが、両方のリストをクリアし続けます。ベクトルを使用せずにC++で配列のサイズを増やす

string name; 
int numOfClasses = 1; 
string *listOfCourses = new string[numOfClasses]; 
string studentclasses; 

void addToList(string n,int i) { 
    numOfClasses++; 
    string *copyOfListOfCourses = new string[numOfClasses]; 
    memcpy(copyOfListOfCourses, listOfCourses, numOfClasses + 1); 

    copyOfListOfCourses[i] = n; 
    delete[] listOfCourses; 
    listOfCourses = copyOfListOfCourses; 


} 
+1

を試してみてください。C++の配列は静的な大きさになっています。 –

+0

は離れていなければなりません。それ以外の場合は、割り当てを受けていません。 –

+3

@EliSadoffどこでOPが静的なサイズの配列を使用しますか?説明してください? –

答えて

6
memcpy(copyOfListOfCourses, listOfCourses, numOfClasses + 1); 

memcpy() C++のクラス、そのコンストラクタやデストラクタについて何も知らないCライブラリ関数です。 std::stringを含む配列のコピーには使用できません。このmemcpy()には少なくとも2つの他の問題がありますが、最初にstd::stringと一緒に使用することはできません。

これを行う正しい方法は、C++アルゴリズムstd::copyを使用するか、手動のforループを使用することです。正しい計算はのサイズを取得するために、numOfClassesから 1を減算しなければならないので、この時点でnumOfClassesは、既存の配列の大きさよりも大きいものである新しい配列のサイズであること

#include <algorithm> 

std::copy(listOfCourses, listOfCourses+(numOfClasses-1), 
      copyOfListOfCourses); 

copyOfListOfCourses[i] = n; 

代わりに、単に新しいものに全体の既存の配列をコピーする、そのまま、本当にその後、何が起こる必要があります、代わりに1

別の問題を追加する既存の配列はこれですもう1つ新しい値のためのスペースを作るために、インデックス#iの既存の値から始めて、サイズ変更された配列内のすべての値をシフトするcopy。これは第2のstd::copy()コールになります。これはあなた自身で把握できるはずです。

+1

['std :: move_iterator'](http://en.cppreference.com/w/cpp/iterator/move_iterator)を使用すると、文字列が移動され、コピーされないようにすることができます。小さな文字列の最適化では問題にはならないでしょうが、おそらく使用する価値があります。 – Mgetz

1

新しい配列を作成し、古い要素を新しい配列にコピーして、古い配列を新しい配列に置き換えることができます。明らかに、ポインタを使用します。

int *arr = new int[3]; 
arr[0] = 1; 
arr[1] = 2; 
arr[2] = 3; 

そして、あなたは4つの要素を格納するために、たとえば、サイズを変更したい:

は、動的メモリを使用して作成arr命名int配列へのポインタを持っていると仮定します。

あなたが新しいサイズでtempという名前の新しいint配列へのポインタを作成します。今、あなたは削除することができ

for (int i = 0; i < 3 ; i++) // 3 for the size of the old array 
{ 
    temp[i] = arr[i]; // copy the elements 
} 

int *temp = new int[4]; 

は今、新しい配列に古い要素をコピー古いメモリとポイントarr新しいメモリへ:

delete[] arr; 
arr = temp; 

そして今、あなたがこれを行うことができます:

arr[3] = 4; 
-1

はあなたがすることはできません。この

#include<iostream> 
#include<string.h> 
using namespace std; 
int *a; 
int nCurrentSize =0; 
void pushBack(int n) 
{ 
    if(0 == nCurrentSize) 
    { 
    a= new int[1+nCurrentSize]; 
    a[nCurrentSize] = n; 
    nCurrentSize++; 
    } 
    else 
    { 
    int *tmp = new int[nCurrentSize]; 
    memcpy(tmp,a,nCurrentSize*sizeof(int)); 
    delete []a; 
    a= new int[1+nCurrentSize]; 
    memcpy(a,tmp,nCurrentSize*sizeof(int)); 
    a[nCurrentSize] = n; 
    delete []tmp; 
    nCurrentSize++; 
    } 
} 
void display() 
{ 
for(int i=0;i<nCurrentSize; i++) 
    cout<<a[i]<<","; 
} 

int main() 
{ 
pushBack(91); 
pushBack(5); 
pushBack(3); 
pushBack(7); 
pushBack(1); 
pushBack(3); 
pushBack(2); 
pushBack(2); 
pushBack(0); 
pushBack(5); 

display(); 
cout<<endl<<nCurrentSize; 
} 
+0

「これを試してください」という説明はあまり役に立ちません。 –

関連する問題