Ich codiere in C ++. Wenn ich eine Funktion habevoid foo(vector<int> test)
und sie in meinem Programm aufrufe, wird der Vektor dann als Wert oder Referenz übergeben? Ich bin mir nicht sicher, weil ich weiß, dass Vektoren und Arrays ähnlich sind und dass eine Funktion wie void bar(int test[])
der Test den Test als Referenz (Zeiger?) Statt als Wert bestehen würde. Ich vermute, dass ich den Vektor explizit als Zeiger / Referenz übergeben müsste, wenn ich vermeiden möchte, dass ein Wert übergeben wird, aber ich bin mir nicht sicher.
92
Antworten:
Wenn ich raten müsste, würde ich sagen, dass Sie einen Java-Hintergrund haben. Dies ist C ++, und die Dinge werden als Wert übergeben, sofern Sie mit dem
&
Operator -operator nichts anderes angeben (beachten Sie, dass dieser Operator auch als Operator "Adresse von" verwendet wird, jedoch in einem anderen Kontext). Dies ist alles gut dokumentiert, aber ich werde es trotzdem wiederholen:Sie können auch einen Zeiger auf einen Vektor übergeben (
void foo(vector<int> *bar)
) übergeben. Wenn Sie jedoch nicht wissen, was Sie tun, und das Gefühl haben, dass dies wirklich der richtige Weg ist, tun Sie dies nicht.Vektoren sind es auch nicht dasselbe wie Arrays! Intern verfolgt der Vektor ein Array, von dem er die Speicherverwaltung für Sie übernimmt, aber auch viele andere STL-Container. Sie können einen Vektor nicht an eine Funktion übergeben, die einen Zeiger oder ein Array erwartet, oder umgekehrt (Sie können jedoch auf das zugrunde liegende Array zugreifen (auf dieses zeigen) und dies verwenden). Vektoren sind Klassen, die durch ihre Elementfunktionen viel Funktionalität bieten, während Zeiger und Arrays integrierte Typen sind. Außerdem werden Vektoren dynamisch zugewiesen (was bedeutet, dass die Größe zur Laufzeit bestimmt und geändert werden kann), während die Arrays im C-Stil statisch zugewiesen werden (ihre Größe ist konstant und muss zur Kompilierungszeit bekannt sein), was ihre Verwendung einschränkt.
Ich schlage vor, Sie lesen etwas mehr über C ++ im Allgemeinen (insbesondere Array-Zerfall ) und schauen sich dann das folgende Programm an, das den Unterschied zwischen Arrays und Zeigern veranschaulicht:
quelle
A
vector
ist funktional identisch mit einem Array. Aber für die Sprachevector
ist ein Typ undint
ist auch ein Typ. Für ein Funktionsargument wird ein Array eines beliebigen Typs (einschließlichvector[]
) als Zeiger behandelt. Avector<int>
ist nicht dasselbe wieint[]
(für den Compiler).vector<int>
ist kein Array, keine Referenz und kein Zeiger - es wird als Wert übergeben und ruft daher den Kopierkonstruktor auf.Sie müssen es also verwenden
vector<int>&
(vorzugsweise mitconst
, wenn die Funktion es nicht ändert), um es als Referenz zu übergeben.quelle
void foo(vector<int> test)
Der Vektor würde dabei als Wert übergeben.
Sie haben je nach Kontext mehr Möglichkeiten, Vektoren zu übergeben: -
1) Als Referenz übergeben: - Dadurch kann die Funktion foo Ihren Inhalt des Vektors ändern. Effizienter als die Übergabe von Werten, da das Kopieren von Vektoren vermieden wird.
2) Übergeben von const-reference: - Dies ist sowohl effizient als auch zuverlässig, wenn die Funktion den Inhalt des Vektors nicht ändern soll.
quelle
Wenn wir Vektor als Wert in einer Funktion als Argument übergeben, wird einfach die Kopie des Vektors erstellt, und es tritt keine Auswirkung auf den Vektor auf, der in der Hauptfunktion definiert ist, wenn wir diese bestimmte Funktion aufrufen. Wenn wir den Vektor als Referenz übergeben, was auch immer in dieser bestimmten Funktion geschrieben ist, wird jede Aktion für den Vektor ausgeführt, der in der Haupt- oder anderen Funktion definiert ist, wenn wir diese bestimmte Funktion aufrufen.
quelle