Funksjon som returnerer en vektor i C ++

Funksjon som returnerer en vektor i C ++
Kan en funksjon returnere en vektor i C++? Årsaken til at dette spørsmålet stilles, er fordi en funksjon ikke kan returnere en matrise (som ligner på en vektor) i C++. Svaret er enkelt. Ja, en funksjon kan returnere en vektor i C ++ og på forskjellige måter. Denne artikkelen forklarer de forskjellige måtene en C ++ -funksjon kan returnere en vektor.

For å kode en vektor i C ++, må vektorbiblioteket inkluderes i programmet. Vektorbiblioteket har vektorklassen som vektorobjekter kan bli instantiert fra (opprettet).

Programmet der alle kodeprøvene i denne artikkelen er, begynner med:

#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;

En vektor av strenger brukes.

Artikkelinnhold

- Returnerende vektor med normalt vektornavn

- Returnerer en vektor bokstavelig

- Returnerer en vektorreferanse

- Returnerer en vektorpeker

- Konklusjon

Returnerende vektor med normalt vektornavn

La interessen av interesse være:

vektor lagre = "brød", "kjøtt", "ris", "tomatsaus", "ost";

Vektoren er en liste over elementer i en liten matbutikk. Navnet, lagring av denne vektoren, skal sendes som et argument til en funksjon, hvis parameter er en vektor, men med navnet VTR. Funksjonen av interesse kan være:

vektor FN (vektor vtr)
Returner VTR;

Legg merke til returtypen for funksjonsdefinisjonen. Navnet på vektoren er butikk. Dette er argumentet for funksjonssamtalen. Parameteren for funksjonen som tilsvarer vektoren er:

vektor VTR

Merk at argumentet for funksjonen og parameternavnet er forskjellige (de kan fortsatt være de samme). Så snart funksjonen begynner å utføre, blir følgende uttalelse fremsatt:

vektor VTR = butikk;

Denne uttalelsen tilsvarer følgende to uttalelser:

vektor lagre = "brød", "kjøtt", "ris", "tomatsaus", "ost";
vektor VTR = butikk;

Og så er VTR en kopi av vektoren, butikk. På dette tidspunktet er det to vektorer med samme innhold i minnet for programmet. En passende C ++ hovedfunksjon for koden kan være:

int main ()

vektor v = fn (butikk);
for (int i = 0; icout << v[i] << ", ";
cout << endl;
retur 0;

Legg merke til at ordbutikken er argumentet for funksjonssamtalen. Når funksjonen kalles, oppstår to kopier av det samme vektorinnholdet i minnet. Funksjonen (samtale) returnerer en vektor, som mottas av en annen vektor, v. Når programmet er ferdig, er det tre vektorer av samme kopi i minnet. Disse tre kopiene av det samme innholdet kan reduseres til en kopi ved å bruke en referansevektor, eller pekervektor. Utgangen for programmet ovenfor er:

brød, kjøtt, ris, tomatsaus, ost,

Returnerer en vektor bokstavelig

I dag (i 2022) er en vektor bokstavelig den samme som en gruppe bokstavelig. Denne bokstavelige kalles en initializer_list, i dag i C++. Så å returnere en vektor bokstavelig av en funksjon, er det samme som å returnere en initializer_list. La initlializer_list være:

"brød", "kjøtt", "ris", "tomatsaus", "ost"

La funksjonsdefinisjonen for å returnere initializer_listen være,

vektor fn ()
returner "brød", "kjøtt", "ris", "tomatsaus", "ost";

Initializer_list er sammensatt på stedet i returerklæringen, og returnerte. Funksjonsdefinisjonen har ingen parameter, men har samme returtype som motstykket i forrige seksjon. La hoved C ++ -funksjonen være:

int main ()

vektor v = fn ();
for (int i = 0; icout << v[i] << ", ";
cout << endl;
retur 0;

Funksjonsanropet, denne gangen, har ikke noe argument, men returverdien mottas av samme vektor og type forrige seksjon.

Når programmet er fullført, ville det være to eksemplarer av samme vektor i minnet? Nei. Det ville bare være en kopi, som er v. Initializer_list er et slags uttrykk, kalt en rvalue. Når denne typen uttrykk ikke lenger er nødvendig i minnet, kan det slettes av C ++ for å ha mer minneplass? Det er ikke viktig om det forblir i minnet etter at det har blitt brukt mens programmet fortsetter å løpe. Det vil bli slettet hvis plassen er nødvendig. Programutgangen er:

brød, kjøtt, ris, tomatsaus, ost,

Returnerer en vektorreferanse

Programmet her vil gjøre det det første programmet ovenfor har gjort, men bare med en kopi av samme vektor. Det vil være tre forskjellige navn for samme vektor, skjønt. La interessen av interesse være:

vektor lagre = "brød", "kjøtt", "ris", "tomatsaus", "ost";
Variabelen, butikk her, er et vanlig navn. La interessefunksjonen være:
vektor & fn (vektor & vtr)
Returner VTR;

Legg merke til tilstedeværelsen og plasseringen av og i parameteren. Det betyr at VTR er en referert (synonym) vektor, og ikke en kopi av argumentet som skal sendes. Legg merke til tilstedeværelsen og plasseringen av og i returtypen. Det betyr at referansen (synonym) til en vektor vil bli returnert av funksjonen. Legg merke til at den indre uttalelsen, "Returner VTR;" har ikke &. La C ++ hovedfunksjon være:

int main ()

vektor *v = & fn (butikk);
for (int i = 0; istørrelse(); i ++)
cout << (*v)[i] << ", ";
cout << endl;
retur 0;

Signaturen til funksjonsdefinisjonen, og funksjonsanropserklæringen, er:

vektor & fn (vektor & VTR)

og

vektor *v = & fn (butikk);

henholdsvis. Legg merke til igjen, tilstedeværelsen og plasseringen av &, i returtypen av funksjonsdefinisjonen. Legg merke til tilstedeværelsen og plasseringen av og i funksjonsanropserklæringen. Argumentet til funksjonssamtalen er det vanlige navnet på vektoren, butikk. Funksjonen returnerer en referanse, og den mottas av en peker, v.

Og så, det er tre forskjellige variabler i programmet, som alle refererer til samme vektorminneplassering (funksjonen returnerte & VTR, som er et synonym for butikk). Utgangen er:

brød, kjøtt, ris, tomatsaus, ost,

Returnerer en vektorpeker

Programmet her vil gjøre det det første programmet ovenfor har gjort, men bare med en kopi av samme vektor. Det vil være tre forskjellige navn for samme vektor. La interessen av interesse være:

vektor lagre = "brød", "kjøtt", "ris", "tomatsaus", "ost";
Variabelen, butikk her, er et vanlig navn. La interessefunksjonen være:
vektor * FN (vektor *vtr)
Returner VTR;

Legg merke til tilstedeværelsen og plasseringen av * i parameteren. Det betyr at VTR er en pekervektor, og ikke en kopi av noe vektorargument som skal sendes. Legg merke til tilstedeværelsen og plasseringen av * i returtypen. Merk igjen at den indre uttalelsen, "Returner VTR;" har ikke & eller *. La C ++ hovedfunksjon være:

int main ()

vektor *v = fn (& butikk);
for (int i = 0; istørrelse(); i ++)
cout << (*v)[i] << ", ";
cout << endl;
return 0;

Signaturen til funksjonsdefinisjonen, og funksjonsanropserklæringen, er:

vektor * FN (vektor *VTR)

og

vektor *v = fn (& butikk);

henholdsvis. Legg merke til tilstedeværelsen og plasseringen av * i returtypen for funksjonsdefinisjonen. Legg merke til tilstedeværelsen og plasseringen av og i funksjonsanropserklæringen; Det er foran argumentet, lagring og ikke foran fn (), som ikke har & eller *. Funksjonen returnerer en referanse, og den mottas av en peker, v.

Og så, det er tre forskjellige variabler i programmet, som alle refererer til samme vektorminneplassering. Utgangen er:

brød, kjøtt, ris, tomatsaus, ost,

Konklusjon

En funksjon kan returnere en vektor med normalt navn. En funksjon kan returnere en vektor bokstavelig (initializer_list), for å bli mottatt av en normal vektor (navn). En vektor kan returnere en vektorreferanse, for å bli mottatt av en vektorpeker. En vektor kan returnere en vektorpeker, fremdeles for å bli mottatt av en annen vektorpeker.