2016-11-03 42 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在哪裏使用_statically sizes arrays_?請解釋? –

回答

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

memcpy()是一個C庫函數,什麼都不知道關於C++類,它們的構造函數和析構函數。它不能用於複製包含std::string的數組。 memcpy()還有至少兩個其他問題,除了它首先不能用於std::string

正確的方法是使用C++算法std::copy或使用手動for循環。

#include <algorithm> 

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

注意numOfClasses在這一點上是新的數組,這比現有的數組的大小一個更大的尺寸,所以正確的計算必須 1從numOfClasses,得到的尺寸現有的陣列,而不是加1

另一個問題是這樣的:

copyOfListOfCourses[i] = n; 

而不只是複製整個現有陣列到新的,由於是,真正那麼一定會發生是另一個拷貝以移動調整大小的數組中的所有值,從索引#i處的現有值開始增加1,爲新值騰出空間。這將是第二個std::copy()電話,您現在應該可以自己弄清楚。

+1

如果您想要使用['std :: move_iterator'](http://en.cppreference.com/w/cpp/iterator/move_iterator),那麼字符串就會被移動,而不會被複制。小字符串優化可能無關緊要,但可能值得使用。 – Mgetz

1

您可以創建一個新數組,將舊元素複製到新數組,然後用新數組替換舊數組。顯然,使用指針。

假設你有一個指向名爲arrint陣列,動態內存中創建:

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

而且要調整其大小,例如存儲4個元素。

您將創建一個指向與新的大小命名tempint陣列:

int *temp = new int[4]; 

現在老元素複製到新數組:

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

現在你可以刪除舊內存和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

「試試這個」沒有解釋是不是很有幫助。 –