2015-01-20 6 views
1

Я застрял, и я не уверен, как это сделать, чтобы создать копию моего массива. Как создать копию моего массива Person Person с его оригинальным контентом?Как скопировать массив структур?

#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 


struct Person { 
    string name; 
    int age; 
}; 

const int arraySize = 2; 
Person arrayM[arraySize]; 
void createArray(Person personArray[], int SIZE); 
void printArray(Person personArray[], int SIZE); 
int main() 
{ 
    srand(time(NULL)); 
    cout << "Hello world!" << endl; 
    createArray(arrayM, arraySize); 
    printArray(arrayM, arraySize); 
    return 0; 
} 

void createArray(Person personArray[], int SIZE) 
{ 
    for(int i = 0; i < arraySize; i++) 
    { 
     int age1 = rand() % 50 + 1; 
     int age2 = rand() % 25 + 1; 
     personArray[i].age = age1; 
     personArray[i].age = age2; 
    } 
} 

void printArray(Person personArray[], int SIZE) 
{ 
    for(int i = 0; i < SIZE; i++) 
    { 
     cout << endl; 
     cout << personArray[i].age << " " << personArray[i].age; 
    } 
} 

void copyStruct(Person personArray[], int SIZE) 
{ 
    int copyOfArray[SIZE]; 
    for(int i = 0; i < SIZE; i++) 
    { 
     ??? 
    } 
} 
+1

Используйте [станд :: массив] (HTTP : //en.cppreference.com/w/cpp/container/array) и C++ 11 –

+4

Рассмотрите возможность использования контейнера stl типа 'std :: vector ' – Bathsheba

+0

Важный момент: независимо от того, как вы: «копируете» perso nArray ... ваша переменная "int copyOfArray []" * перестает существовать * при выходе из copyStruct(). Вы * ДОЛЖНЫ * выделять свою «копию» по-другому, если вы хотите использовать ее вне copyStruct() ... – FoggyDay

ответ

2

Предполагая, int copyOfArray[SIZE] должен быть Person copyOfArray[SIZE] праведный заменить ??? с

copyOfArray[i] = personArray[i]; 

или использовать станд :: массив как предложено Basile

2

Более идиоматических, используя алгоритм std. Я также повторно напечатал copyOfArray до Person.

void copyStruct(Person personArray[], int SIZE) 
{ 
    Person copyOfArray[SIZE]; 
    std::copy(
     personArray, 
     personArray + SIZE, 
     +copyOfArray // + forces the array-to-pointer decay. 
    ); 
    // Do something with it 
} 

Однако, как уже было сказано, вы скорее должны использовать std::vector или std::array, которые перегружать operator =.

+0

Использование 'std :: vector <>' имеет дополнительное преимущество, которое устраняет необходимость в нестандартных VLA-расширениях, что в настоящее время требуется. – WhozCraig

+0

Является ли '+ copyOfArray' намеренным? Если это так, вы можете это объяснить. – MSalters

+0

@WhozCraig Я думал о C++ 14, но на самом деле это не так. – Quentin

0

Это должно работать:

Определим функцию 'copyStruct' так:

void copyStruct(Person destOfArray[], Person srcArray[], int SIZE) 
{ 
    for(int i = 0; i < SIZE; i++) 
    { 
     destOfArray[i].age = srcArray[i].age; 
     destOfArray[i].name = srcArray[i].name; 
    } 
} 

И использовать функцию вроде этого:

Person copyOfArray[arraySize]; 
copyStruct(copyOfArray, arrayM, arraySize); 

// Now print the content of 'copyOfArray' using your 'printArray' function 
printArray(copyOfArray, arraySize); 
+0

Зачем беспокоиться о 'copyStruct()'? 'Person :: Person (Person const &)', неявный конструктор копий работает нормально. – MSalters

+0

@MSalters: Поскольку владелец сообщения захотел скопировать массив структур, а не одну структуру. –

+0

Уверен, но если у вас есть рабочая копия ctor, вы можете использовать 'std :: copy' для копирования массива. Копирование полей необходимо только в том случае, если неявная копия ctor не работает по какой-либо причине. – MSalters

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