2016-03-02 4 views
0

У меня есть массив структуры (с параметрами имени и числа), а исходный массив принимает элементы из документа, который я создал. Начальный размер списка начинается с 1000. Когда список заполняется, я вызываю другой метод, с которым я борюсь. Я бы хотел, чтобы он скопировал данные в новый массив, который удваивал размер, а затем удалял старый массив.Копировать массив, а затем удалить оригинал

Если я назову его: array1 и array2, у меня есть моя программа, использующая массив1. Мне нужна помощь с указателями, которые заставят array2 работать как array1.

Есть ли способ скопировать массив в массив temp того же или нового размера, а затем переделать исходный массив, переназначающий это? Для этого упражнения я не могу использовать векторы. Хотя я знаю, как их использовать, и что они решают эту проблему, хотя я лучше, я пытаюсь сделать это только с массивами.

using namespace std; 

struct Information { 
    char functionality; 
    int SSN; 
    string name; 
}; 

int numPeople = 1000; 

//Gets called if the initial array (whatever size) is filled 
void doubleArray(Information *array){ 
    numPeople = numPeople * 2; 
    //Will now be the doubled array size 
    Information temp[numPeople] 
    for(int i = 0; i < numArray; i++){ 
    temp[i].SSN = array[i].SSN; 
    temp[i].name = array[i].name; 
    } 
    //Normally makes it crash 
    delete[] array; 
} 

редактировать: Это то, что я в настоящее время

void doubleArray(Information *person){ 
    numPeople = numPeople * 2; 
    Information* temp = new Information[numPeople]; 
    memcpy(temp, person, numPeople); 
    delete[] person; 
    person = temp; 
} 

Он получает numPeople = 1000 (начальный размер списка), а затем выходит из строя вскоре после этого. Правильно ли дублирующий массив?

+5

Пожалуйста, говорите меньше и покажите нам код, с которым вы боретесь ... – Christophe

+4

Используйте 'std :: vector'. –

+0

Попробуйте googling "memcpy" –

ответ

1

Массивы фиксированного размера. Вы не можете изменить емкость исходного массива.

{Использование std::vector}

Вы можете иметь указатель на массив. И используйте тот же указатель. Когда массив заполнен, вы можете выделить другой массив, скопировать старые элементы массива в новый массив, удалить старый массив и назначить указатель на массив для нового массива.

{Я уже std::vector?}

Кстати, есть структура данных, которая выполняет изменение размера по мере необходимости. Если я правильно помню, это std::vector. Попробуйте. :-)

+0

Да, я знаю, что векторы могут это сделать, и я знаю, как это сделать с помощью векторов - но это упражнение хочет, чтобы я НЕ использовал вектор – Speakmore

0

Предполагая, что вы используете std::array (что вам должно быть), то копирование массива очень просто.

std::array<myStruct, 1000> array1{}; 
std::array<myStruct, 2000> array2{}; 
// codes... 
std::copy(array1.begin(), array1.end(), array2.begin()) 

Однако, это конкретный сценарий, в котором вы используете только эти два массива. Он не будет динамически удваивать размер массива, поскольку вы просто не можете делать это динамически с помощью массивов на основе стека, как и c-массивы [].

Что можно и нужно использовать, это std::vector<myStruct>. Это будет динамично расти по мере необходимости. Пока вы не предоставите нам код и более конкретную проблему, это лучший совет, который я могу предложить с предоставленной информацией.

+0

Я добавлю код, когда вернусь домой, как 10 минут – Speakmore

0

Если вам не разрешено использовать std::vector, как указано в одном из ваших комментариев, вам нужно взглянуть на динамическое распределение.

size_t sz = [whatever]; 

// Dynamically allocate an array of size sz. 
T* T_array = new T[sz]; 

// Do whatever... 

delete[] T_array; // new[] needs to be paired with delete[]. 
T_array = nullptr; // Not strictly necessary, but a good idea if you have more code after. 

Поскольку размер не обязательно должен быть постоянным для динамического массива, это позволит вам выделять память по мере необходимости. Затем вы можете использовать std::copy() для копирования данных из одного массива в другой, как Goodies mentioned.

[Для получения дополнительной информации о динамическом распределении см. here.]

Смежные вопросы