Hvordan du kan snu en C ++ -array

Hvordan du kan snu en C ++ -array
Tenk på følgende matrise: char arrf [] = 'm', 'n', 'o', 'p', 'q';

Det motsatte av denne matrisen er:

char arrr [] = 'q', 'p', 'o', 'n', 'm';

Karakterene blir i omvendt rekkefølge, i initializer_listen. Legg merke til at i omvendt rekkefølge forblir 'O' på sin posisjon. Dette er fordi antall elementer i matrisen er merkelig.

Tenk nå på følgende matrise:

char arrf [] = 'l', 'm', 'n', 'o', 'p', 'q';

Det motsatte av denne matrisen er:

char arrr [] = 'q', 'p', 'o', 'n', 'm', 'l';

Karakterene blir i omvendt rekkefølge, i initializer_listen. Denne gangen byttes de midtre elementene fordi antall elementer i matrisen er jevn.

Det er forskjellige måter å reversere matrisen på, og denne artikkelen utforsker disse måtene.

Artikkelinnhold

- INNLEDNING - Se ovenfor

- Bruke et ekstra utvalg for reversering

- Omvendt matrise ved å bytte elementer

- Reverserende matrise ved hjelp av en rekursiv funksjon

- Bruk av std :: omvendt ()

- Konklusjon

Bruke et ekstra utvalg for reversering

Med denne metoden, lag en annen rekke av samme type og størrelse som den originale matrisen, men tom. Neste, les den første matrisen bakfra og passet inn elementene i den andre matrisen fra fronten ved hjelp av en for-loop. Følgende program illustrerer dette:

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

char arrf [] = 'm', 'n', 'o', 'p', 'q';
int size = sizeof (arrf)/sizeof (arrf [0]); // Få størrelsen på matrisen
char arrr [størrelse];
for (int i = 0, j = størrelse-1; j> = 0; i ++, j--)
arrr [i] = arrf [j];

for (int i = 0; icout<
cout<retur 0;

Utgangen er:

Q p o n m

Den første uttalelsen i C ++ hovedfunksjonen oppretter den første matrisen uten å indikere størrelsen. Den andre uttalelsen oppnår størrelsen ved å dele den totale størrelsen på matrisen i byte med størrelsen på det første elementet i matrisen (tross alt er alle elementene i en C ++ -array, av samme type). Neste uttalelse oppretter den andre matrisen av samme type og størrelse, men tom.

Kodesegmentet etter er for-loop. For-loop kopierer det siste elementet i den første matrisen, og setter det i den første plasseringen av den andre matrisen. Den kopierer det siste men-en-elementet i den første matrisen og setter inn den andre plasseringen av den andre matrisen. Den kopierer det tredje-til-siste elementet i den første matrisen og setter inn den tredje plasseringen av den andre arrayen, og inntil variabelen indeksen, i som "flytter opp", når den andre matrisen det siste elementet i den andre arrayen til indeksen Størrelse-1. Indeks, J “Moves Down” den første matrisen fra størrelse-1 til 0. Jeg beveger meg oppover den andre matrisen mens J beveger seg nedover den første matrisen.

I parentesene til for-loopen er jeg og j erklært i den første uttalelsen. Så lenge J er større enn eller lik null, vil kopieringen fortsette - det er mens -betingelsen. Økningen av I og Decrement of J, danner den siste uttalelsen i parentesene.

Den siste for-loop skriver ut elementene i den andre matrisen.

Omvendt matrise ved å bytte elementer

De siste og første elementene kan byttes for den eneste matrisen. De siste-men-ene og andre elementene kan byttes for samme matrise. Tredje-til-siste og tredje elementer kan byttes og til midtpunktet av matrisen er nådd og byttestopp. Hvis antallet elementer er merkelig, endrer ikke det midterste elementet sin posisjon. Hvis antall elementer er jevn, er det to midtelementer som byttes ut.

Igjen, det er to indeksvariabler: i og j, men bare for en matrise. Jeg er økt og J er dekrementert for hver iterasjon til de nesten møtes. Mens-betingelsen for dette er, (jeg < j). The following program, illustrates this method:

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

char arr [] = 'm', 'n', 'o', 'p', 'q';
int size = sizeof (arr)/sizeof (arr [0]);
for (int i = 0, j = størrelse-1; i< j; i++,j--)
char temp = arr [i];
arr [i] = arr [j];
arr [j] = temp;

for (int i = 0; icout<
cout<retur 0;

Utgangen er:

Q p o n m

Reverserende matrise ved hjelp av en rekursiv funksjon

En rekursiv funksjon er en funksjon som fortsetter å ringe seg selv til en tilstand er oppfylt. Dette forklares bedre med et eksempel. Tenk på følgende øverste del av programmet:

#inkludere
ved hjelp av navneområdet STD;
char arr [] = 'm', 'n', 'o', 'p', 'q';
int siz = sizeof (arr)/sizeof (arr [0]);
void reverseArray (char arr [], int i)
// basetilstand
if (i == siz)
komme tilbake;
char element = arr [i]; // trekke ut element
ReverseArray (arr, i+1); // rekursiv samtale
arr [siz-i-1] = element; //spore tilbake

Arrayen er deklarert og størrelsen på matrisen bestemmes som siz (uten e). Etter det i koden er den rekursive funksjonsdefinisjonen. Det første kodesegmentet i funksjonen (IF-konstruksjon) er tilstanden som skal oppfylles. I er indeksvariabelen for tilgang til matriseelementene fra indeks 0 til indeks Siz-1. Når jeg er lik Siz, kommer funksjonen tilbake og slutter å ringe seg selv.

C ++ hovedfunksjonen har samtalen,

ReverseArray (arr, 0);

Dette kaller den rekursive funksjonen med to argumenter: den første er navnet på matrisen; Den andre er begynnelsesindeksen for i, null.

Når funksjonen kalles første gang, blir 'M' tildelt et sted i minnet identifisert etter element. Etter den uttalelsen kalles funksjonen igjen innenfor funksjonen med "ReverseArray (arr, i+1);". Den siste uttalelsen i funksjonen har ikke blitt ivaretatt. Denne gangen kalles funksjonen med i = 1; og 'n' er tildelt et annet minneplass, fremdeles identifisert av, element.

Tredje gang funksjonen kalles, i = 2; og 'O' er tildelt et tredje minneplassering som fortsatt er identifisert Byrem -element. Fjerde gang funksjonen kalles, i = 3; og 'P' er tildelt et fjerde minneplassering som er identifisert av elementet. Femte gang funksjonen kalles, i = 4; og 'Q' er tildelt et femte minneplassering som fortsatt er identifisert av elementet.

Sjette gang funksjonen kalles, i = 5 som er størrelsen på matrisen og funksjonen returnerer på grunn av IF-konstruksjonen. Alt dette mens den siste uttalelsen i funksjonen ikke har blitt ivaretatt. Denne siste uttalelsen er:

arr [siz-i-1] = element;

Med denne uttalelsen, hva som holdes av element, tildeles en matriseposisjon. Husk at det er fem steder i minnet med identifikatorelementet som holder karakterene: 'M', 'n', 'o', 'p', 'q', i den rekkefølgen.

Det er sant at funksjonen har returnert tomrom, men den siste uttalelsen må fremdeles utføres, fem ganger. For hver samtale av funksjonen ble den siste uttalelsen registrert en gang, i minnet. Første gang den utføres, Siz -I -1 = 5 - 0 - 1 = 4; ved samtalen som funksjonen kommer tilbake, men bruker den første indeksen. Og så,

arr [4] = 'q'
går bakover. Andre gang den siste uttalelsen utføres, Siz -I -1 = 5 - 1 - 1 = 3. Og så,
arr [3] = 'P'
Tredje gang den siste uttalelsen utføres, Siz -I -1 = 5 - 2 - 1 = 2. Og så,
arr [2] = 'o'
Fjerde gang den siste uttalelsen utføres, Siz -I -1 = 5 - 3 - 1 = 1. Og så,
arr [1] = 'n'
Den femte og siste gang den siste uttalelsen utføres, Siz -I -1 = 5 - 4 - 1 = 0. Og så,
arr [0] = 'm'

Og så er matrisen blitt omgjort med en rekursiv funksjon.

Bruk av std :: omvendt ()

STD :: Reverse () på algoritmebiblioteket kan også brukes til å snu en matrise, selv om det ikke er åpenbart. For å bruke denne funksjonen, må algoritmebiblioteket inkluderes i programmet. Prototypen for funksjonen er:

mal
constExpr void revers (toveiskjører først, toveisatorer sist);

Det første argumentet er en iterator som peker på det første elementet i en beholder. Det andre argumentet er en annen iterator som peker rett etter det siste elementet i beholderen. En peker til det første elementet i matrisen kan brukes som det første argumentet. En peker som peker rett etter det siste elementet i matrisen kan brukes som det andre argumentet.

Hvis matrisenavnet er ARR, er en peker til det første elementet ARR. En peker som peker rett etter det siste elementet i matrisen er "arr + størrelse" der størrelsen er størrelsen på matrisen. Følgende program, viser hvordan std :: revers () kan brukes til å snu en matrise:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
char arr [] = 'm', 'n', 'o', 'p', 'q';
int siz = sizeof (arr)/sizeof (arr [0]); // størrelse på matrisen
int main ()

omvendt (arr, arr+siz);
for (int i = 0; icout<
cout<retur 0;

Utgangen er:

Q p o n m

Konklusjon

Å reversere en matrise kan gjøres ved å bruke en ekstra matrise, ved å bytte matriseelementer, ved å bruke en rekursiv funksjon, eller ved å bruke STD :: Reverse ().