Funktion, die einen Vektor in C ++ zurückgibt

Funktion, die einen Vektor in C ++ zurückgibt
Kann eine Funktion einen Vektor in C zurückgeben?++? Der Grund, warum diese Frage gestellt wird, ist, dass eine Funktion kein Array zurückgeben kann (das einem Vektor ähnlich ist) in C++. Die Antwort ist einfach. Ja, eine Funktion kann einen Vektor in C ++ und auf unterschiedliche Weise zurückgeben. In diesem Artikel werden die verschiedenen Möglichkeiten erläutert, wie eine C ++ - Funktion einen Vektor zurückgeben kann.

Um einen Vektor in C ++ zu codieren, muss die Vektorbibliothek in das Programm aufgenommen werden. Die Vektorbibliothek hat die Vektorklasse, aus der Vektorobjekte instanziiert werden können (erstellt).

Das Programm, in dem alle Code -Beispiele dieses Artikels sind, beginnt mit:

#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;

Es wird ein Vektor von Strings verwendet.

Artikelinhalt

- Rückgabevektor nach normalem Vektornamen

- Rückgabe eines Vector Literal

- Rückgabe einer Vektorreferenz

- Rückgabe eines Vektorzeigers

- Abschluss

Rückgabevektor nach normalem Vektornamen

Lassen Sie den Vektor von Interesse sein:

Vektor store = "bread", "fleisch", "Reis", "Tomatensauce", "Käse";

Der Vektor ist eine Liste von Artikeln in einem kleinen Lebensmittelgeschäft. Der Name, den Speicher dieses Vektors, ist als Argument an eine Funktion zu senden, deren Parameter ein Vektor ist, aber mit dem Namen VTR, VTR. Die Funktion des Interesses kann sein:

Vektor FN (Vektor vtr)
return vtr;

Beachten Sie den Rückgabetyp der Funktionsdefinition. Der Name des Vektors ist ein Geschäft. Dies ist das Argument für den Funktionsaufruf. Der Parameter für die dem Vektor entsprechende Funktion lautet:

Vektor vtr

Beachten Sie, dass das Argument für die Funktion und der Parametername unterschiedlich sind (sie können immer noch gleich sein). Sobald die Funktion mit der Ausführung beginnt, wird die folgende Erklärung abgegeben:

Vektor vtr = store;

Diese Aussage entspricht den folgenden zwei Aussagen:

Vektor store = "bread", "fleisch", "Reis", "Tomatensauce", "Käse";
Vektor vtr = store;

Und so ist VTR eine Kopie des Vektors, speichern. Zu diesem Zeitpunkt gibt es zwei Vektoren mit dem gleichen Inhalt im Speicher für das Programm. Eine geeignete C ++ - Hauptfunktion für den Code kann sein:

int main ()

Vektor v = fn (store);
für (int i = 0; iCout << v[i] << ", ";
Cout << endl;
Rückkehr 0;

Beachten Sie, dass das Word Store das Argument des Funktionsaufrufs ist. Wenn die Funktion aufgerufen wird, treten zwei Kopien des gleichen Vektorinhalts im Speicher auf. Die Funktion (Anruf) gibt einen Vektor zurück, der von einem anderen Vektor empfangen wird, v. Bis zum Abschluss des Programms befinden sich drei Vektoren derselben Kopie im Speicher. Diese drei Kopien desselben Inhalts können mithilfe eines Referenzvektors oder eines Zeigervektors auf eine Kopie reduziert werden. Die Ausgabe für das obige Programm lautet:

Brot, Fleisch, Reis, Tomatensauce, Käse,

Rückgabe eines Vector Literal

Heute (im Jahr 2022) ist ein Vektorliteral das gleiche wie ein Array -Literal. Dieses Literal wird heute in C als Initializer_List bezeichnet++. Die Rückgabe eines Vektorluchses durch eine Funktion ist also der gleiche wie die Rückgabe einer Initializer_List. Lassen Sie die Initlializer_List sein:

"Brot", "Fleisch", "Reis", "Tomatensauce", "Käse"

Lassen Sie die Funktionsdefinition die Initializer_List zurückgeben,

Vektor fn ()
Rückkehr "Brot", "Fleisch", "Reis", "Tomatensauce", "Käse";

Die Initializer_List wird vor Ort in der Rückgabeerklärung komponiert und zurückgegeben. Die Funktionsdefinition hat keinen Parameter, hat jedoch im vorherigen Abschnitt den gleichen Rückgabetyp wie ihr Gegenstück. Lassen Sie die Haupt -C ++ -Funktion sein:

int main ()

Vektor v = fn ();
für (int i = 0; iCout << v[i] << ", ";
Cout << endl;
Rückkehr 0;

Der Funktionsaufruf hat diesmal kein Argument, aber der Rückgabewert wird vom gleichen Vektor und Typ des vorherigen Abschnitts empfangen.

Wenn das Programm abgeschlossen ist, gibt es zwei Kopien desselben Vektors im Speicher? NEIN. Es würde nur eine Kopie geben, die v ist. Die Initializer_List ist eine Art Ausdruck, das als RValue bezeichnet wird. Wenn diese Art von Ausdruck im Speicher nicht mehr benötigt wird, kann sie von C ++ gelöscht werden, um mehr Speicherplatz zu haben? Es ist nicht wichtig, ob es im Gedächtnis bleibt, nachdem es während des Programms fortgesetzt wurde, während das Programm weiter funktioniert. Es würde gelöscht, wenn sein Raum benötigt wird. Die Programmausgabe lautet:

Brot, Fleisch, Reis, Tomatensauce, Käse,

Rückgabe einer Vektorreferenz

Das Programm hier wird das tun, was das erste Programm oben getan hat, jedoch nur mit einer Kopie desselben Vektors. Es wird jedoch drei verschiedene Namen für denselben Vektor geben. Lassen Sie den Vektor von Interesse sein:

Vektor store = "bread", "fleisch", "Reis", "Tomatensauce", "Käse";
Die Variable, Speicher hier, ist ein gewöhnlicher Name. Lassen Sie die Funktion des Interesses sein:
Vektor & fn (Vektor & vtr)
return vtr;

Beachten Sie das Vorhandensein und die Position von & im Parameter. Es bedeutet, dass VTR ein referenzierter (Synonym-) Vektor ist und keine Kopie des zu sendenden Arguments. Beachten Sie das Vorhandensein und die Position von & im Rückgabetyp. Dies bedeutet, dass die Referenz (Synonym) eines Vektors von der Funktion zurückgegeben wird. Beachten Sie, dass die Inside -Anweisung "VTR zurückgeben"; hat nicht &. Lassen Sie die C ++ - Hauptfunktion sein:

int main ()

Vektor *v = & fn (store);
für (int i = 0; iGröße(); i ++)
Cout << (*v)[i] << ", ";
Cout << endl;
Rückkehr 0;

Die Signatur der Funktionsdefinition und der Funktionsaufrufanweisung lautet:

Vektor & fn (Vektor & vtr)

Und

Vektor *v = & fn (store);

bzw. Hinweis erneut, das Vorhandensein und die Position von &, im Rückgabetyp der Funktionsdefinition. Beachten Sie das Vorhandensein und die Position von & in der Funktionsaufrufanweisung. Das Argument des Funktionsaufrufs ist der gewöhnliche Name des Vektors, Speicher. Die Funktion gibt eine Referenz zurück und wird von einem Zeiger V empfangen, v.

Daher gibt es drei verschiedene Variablen im Programm, die sich auf denselben Vektorspeicherort beziehen (die Funktion wurde zurückgegeben & VTR, ein Synonym für den Speicher). Die Ausgabe ist:

Brot, Fleisch, Reis, Tomatensauce, Käse,

Rückgabe eines Vektorzeigers

Das Programm hier wird das tun, was das erste Programm oben getan hat, jedoch nur mit einer Kopie desselben Vektors. Es werden drei verschiedene Namen für denselben Vektor geben. Lassen Sie den Vektor von Interesse sein:

Vektor store = "bread", "fleisch", "Reis", "Tomatensauce", "Käse";
Die Variable, Speicher hier, ist ein gewöhnlicher Name. Lassen Sie die Funktion des Interesses sein:
Vektor * fn (Vektor *vtr)
return vtr;

Beachten Sie das Vorhandensein und die Position von * im Parameter. Es bedeutet, dass VTR ein Zeigervektor ist und keine Kopie eines Vektorarguments, das gesendet werden muss. Beachten Sie das Vorhandensein und die Position von * im Rückgabetyp. Beachten Sie erneut, dass die Insider -Anweisung "zurückgeben VTR zurückgeben". hat nicht & oder *. Lassen Sie die C ++ - Hauptfunktion sein:

int main ()

Vektor *v = fn (& store);
für (int i = 0; iGröße(); i ++)
Cout << (*v)[i] << ", ";
Cout << endl;
Rückkehr 0;

Die Signatur der Funktionsdefinition und der Funktionsaufrufanweisung lautet:

Vektor * fn (Vektor *vtr)

Und

Vektor *v = fn (& store);

bzw. Beachten Sie das Vorhandensein und die Position von * im Rückgabetyp der Funktionsdefinition. Beachten Sie das Vorhandensein und die Position von & in der Funktionsaufrufanweisung; Es liegt vor dem Argument, speichern und nicht vor FN (), was nicht und oder * hat. Die Funktion gibt eine Referenz zurück und wird von einem Zeiger V empfangen, v.

Und so gibt es drei verschiedene Variablen im Programm, die sich alle auf denselben Vektorspeicherort beziehen. Die Ausgabe ist:

Brot, Fleisch, Reis, Tomatensauce, Käse,

Abschluss

Eine Funktion kann einen Vektor nach ihrem normalen Namen zurückgeben. Eine Funktion kann ein Vektorliteral (Initializer_List) zurückgeben, um von einem normalen Vektor (Name) empfangen zu werden, um empfangen zu werden. Ein Vektor kann eine Vektorreferenz zurückgeben, die von einem Vektorzeiger empfangen wird. Ein Vektor kann einen Vektorzeiger zurückgeben, der noch von einem anderen Vektorzeiger empfangen wird.