Hvordan kopiere en matrise i C ++

Hvordan kopiere en matrise i C ++
I C ++ kan en matrise kopieres manuelt (for hånd) eller ved å bruke STD :: Copy () -funksjonen, fra C ++ Algoritm -biblioteket. I dataprogrammering er det grunt kopiering og det er dyp kopiering. Grunt kopiering er når to forskjellige array -navn (gamle og nye), referer til det samme innholdet. Dyp kopiering er når de to forskjellige array -navnene refererer til to uavhengige, men samme innhold, i minnet. Denne artikkelen omhandler dyp kopiering.

Tenk på følgende matrise:

char arr1 [] = 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o';

Dette er en rekke ti tegn fra bokstavene, 'F' til 'O'. Navnet på denne matrisen er ARR1. Tenk på følgende matrise:

char arr2 [] = 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o';

Navnet på denne matrisen er ARR2. Legg merke til at begge innholdet er det samme. ARR2 ville være en dyp kopi av ARR1 hvis begge initializer_listene er i forskjellige regioner i datamaskinens minne. Denne artikkelen forklarer, manuell dyp kopiering av matrisen og automatisk dyp kopiering av matrisen, i C++.

Artikkelinnhold

- Manuell dyp kopiering av matrisen

- Automatisk dyp kopiering av matrisen

- Konklusjon

Manuell dyp kopiering av matrisen

Med denne tilnærmingen opprettes to matriser av samme størrelse. Den første har innhold mens den andre ikke har innhold. Innholdet i den første blir kopiert til den andre ved hjelp av for-loop. Følgende program illustrerer dette:

#inkludere
ved hjelp av navneområdet STD;
int main ()

#defin størrelse 10
char arr1 [] = 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o';
char arr2 [størrelse];
for (int i = 0; iarr2 [i] = arr1 [i];
retur 0;

Den første linjen i programmet inkluderer C ++ IOSTREAM -overskriften (bibliotek) for inngang og utgang. Denne første linjen er et direktiv. Den andre linjen er ikke et direktiv. Det er en uttalelse. Det insisterer på at ethvert navn som ikke er gitt std :: er av standardnavnet. Deretter er C ++ hovedfunksjonen.

Den første linjen i hovedfunksjonen () er et direktiv. Den definerer størrelsen på begge matriser, til å være 10. Det ender ikke med en semikolon. Det ender med pressen på tastaturet Enter -tasten '\ n' . Denne linjen kunne likt ha vært "int størrelse = 10;". Linjen etter er en uttalelse som definerer den første matrisen. Linjen følgende er erklæringen om den andre matrisen, uten praktisk initialisering, men med samme størrelse.

Det neste kodesegmentet i hovedfunksjonen, gjør kopien, elementet etter element, fra første til den andre matrisen.

Følgende to kodesegmenter kan legges til, for å skrive ut begge arrayinnholdet på terminalen (konsollen):

for (int i = 0; icout << arr1[i] << ";
cout << endl;
for (int i = 0; icout << arr2[i] << ";
cout << endl;

Utgangen skal være,

F g h i j k l m n o
F g h i j k l m n o

Automatisk dyp kopiering av matrisen

Her brukes STD :: Copy () -funksjonen, av C ++ Algoritmebiblioteket. Dette betyr at algoritmeoverskriften (biblioteket) må inkluderes i programmet. Det er ikke nødvendig å kopiere, element etter element, her. Prototypen til STD :: Copy () -funksjonen er:

mal
constExpr OutputIterator Copy (InputIterator First, InputIterator Last,
OutputIterator resultat);

Det første argumentet er en iterator som peker på det første elementet i kildebeholderen (liste). Det andre argumentet er en iterator som peker rett utenfor det siste elementet i kildebeholderen. Det tredje argumentet er en iterator som peker på det første elementet i den tomme destinasjonsbeholderen, som allerede burde vært erklært.

Denne syntaksen kan tolkes for matriser med følgende prototype:

mal
ConstExpr OutputIterator Copy (ARR1, Pointer-to-Just-Past-Arr1, ARR2);

Peker-til-Just-Past-Arr1 er den samme som, ARR1 + størrelse. Så, følgende program, gjør automatisk dyp kopiering av en rekke til en annen:

#inkludere
#inkludere
int main ()

int -størrelse = 10;
char arr1 [] = 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o';
char arr2 [størrelse];
Kopi (ARR1, ARR1+størrelse, ARR2); // Auto kopiering
retur 0;

Legg merke til inkludering av algoritmiblioteket. "Int -størrelse = 10;" har blitt brukt, i stedet for "char arr2 [størrelse];". Merk at matriser fortsatt måtte være av samme størrelse, men med den andre tomme. Den automatiske kopieringserklæringen er:

Kopi (ARR1, ARR1+størrelse, ARR2);

Funksjonen trengte ikke å bli ført med "STD ::", siden det er "Bruke navneområde STD;" øverst i programmet.

Følgende to kodesegmenter kan legges til for å skrive ut begge arrayinnholdet på terminalen (konsollen):

for (int i = 0; icout << arr1[i] << ";
cout << endl;
for (int i = 0; icout << arr2[i] << ";
cout << endl;

Utgangen skal være,

F g h i j k l m n o
F g h i j k l m n o

Konklusjon

I C ++ kan en matrise kopieres manuelt (for hånd) eller automatisk ved hjelp av STD :: Copy () -funksjonen fra C ++ Algoritmbiblioteket. I dataprogrammering er det grunt kopiering og det er dyp kopiering. Grunt kopiering er når to forskjellige array -navn (gamle og nye) refererer til det samme innholdet i minnet. Dyp kopiering er når de to forskjellige array -navnene refererer til to uavhengige, men samme innhold, i minnet. Denne artikkelen har omhandlet dyp kopiering og ikke grunt kopiering.

Med manuell dyp kopieringstilnærming opprettes to matriser av samme størrelse. Den første har innhold, mens den andre ikke har innhold. Innholdet i den første blir kopiert til den andre, ved hjelp av for-loop.

Automatisk dyp kopiering av en matrise til en annen i C ++ involverer STD :: Copy () -funksjonen til C ++ Algoritmebiblioteket. Dette betyr at algoritmeoverskriften (biblioteket) må inkluderes i programmet. Det er ikke nødvendig å kopiere element etter element med for-loop i dette tilfellet siden kopiering er automatisk. Prototypen for STD :: Copy () -funksjonen, tolket for matrisen, er:

mal
ConstExpr OutputIterator Copy (ARR1, Pointer-to-Last-Element-of-Arr1, ARR2);