Przekazywanie wektora przez odniesienie w C ++

Przekazywanie wektora przez odniesienie w C ++
Aby zrozumieć, co to znaczy przekazać wektor przez odniesienie do funkcji w C ++, dobrze jest najpierw zrozumieć, czym jest odniesienie.

Odniesienie

Rozważ następujący kod:

char var = „y”;
char & ref = var;
ref = „z”;
Cout << var << " << ref << endl;

Wyjście to: z z

Pierwsze stwierdzenie w kodzie zaczyna się od deklaracji i przypisania do zmiennej char, var, wartości, „y”. Drugie stwierdzenie ma drugą zmienną o nazwie Ref. To wciąż typowe, char. Jednak tutaj istnieje symbol między Char a zmienną, Ref. Nie ma znaczenia, czy i jest bliżej Char, czy Ref.

Do sędziego jest przypisywane zmienną, var. Co to znaczy? Z powodu i między Char a ref, ref i var stają się alternatywnymi nazwami dla tej samej lokalizacji pamięci o postaci „y”. Teraz można użyć ref lub var do zmiany wartości w lokalizacji pamięci. Kiedy tak się stanie, zarówno VAR, jak i Ref zwrócą tę samą wartość. W powyższym kodzie sędzia został użyty do zmiany wartości.

W poniższym kodzie zawartość tej samej lokalizacji pamięci, o której mowa przez var i ref, jest zmieniana przez var:

char var = „y”;
char & ref = var;
var = 'z';
Cout << var << " << ref << endl;

Wyjście jest takie same: z z

Zmienna odniesienia jest synonimem jakiejś oryginalnej zmiennej. Sama oryginalna zmienna jest nadal odniesieniem.

Może być więcej niż jedno odniesienie do oryginalnej zmiennej, jak pokazuje następujący kod:

char var = „y”;
char & ref1 = var;
char & ref2 = var;
ref2 = „z”;
Cout << var << " << ref1 << " << ref2 << endl;

Wyjście to: z z z

Aby uzyskać odniesienie, przypisz oryginalną zmienną do nowej zmiennej; W deklaracji nowej zmiennej mają i między typem a nową zmienną.

Zaletą użycia zmiennej odniesienia jest to, że istnieje tylko jedna kopia wartości w pamięci, dla różnych nazw zmiennych (synonimy). Z normalnym programowaniem w C ++, jeśli różne lokalizacje pamięci nie są potrzebne, a każda zmienna ma własną lokalizację pamięci o tej samej wartości, byłoby to marnotrawstwem pamięci.

Wektor i odniesienie

Wektor to klasa, z której tworzone są obiekty wektorowe (utworzone instancje). Aby korzystać z klasy wektorowej, biblioteka wektorów musi zostać włączona do programu. Istnieje oryginalna zmienna obiektu Vector. Do tego można powiązać inne zmienne odniesienia (synonim). Wykonanie zmiennej referencyjnej wektorowej odbywa się w Deklaracji, jak w przypadku powyższego obiektu fundamentalnego (char). Poniższy program ilustruje to:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

wektor vtr;
wektor & vtrref1 = vtr;
wektor & vtrref2 = vtr;
powrót 0;

Biblioteka wektorowa jest włączona do programu. Przeznaczony jest wektor ciągów, więc uwzględniono również bibliotekę ciągów. Zwróć uwagę na użycie i pozycję i w drugim i trzecim deklaracjach wektorowych. Wszystkie trzy zmienne obiektowe wektorowe, VTR, VTRREF1 i VTRREF2 są synonimami lub odniesieniami do tej samej lokalizacji pamięci.

vtrref1 i vtrref2 są używane w programie w taki sam sposób jak VTR, bez poprzedzania żadnego i. Innymi słowy, VTR [5], Vtrref1 [5] i Vtrref2 [5] Świat zwracają tę samą wartość znajdującą się w tej samej lokalizacji pamięci.

Zaleta korzystania z wektora referencyjnego

Zawartość obiektu wektorowego może być bardzo długa. Zwykle nie jest pożądane, aby mieć wiele kopii tej samej długiej listy w pamięci. Od czasu do czasu pożądane jest posiadanie dwóch odniesień do tego samego wektora w pamięci. Jest to szczególnie przydatne podczas przekazywania wektora do funkcji. Jeśli wektor nie zostanie przekazany przez odniesienie (lub wskaźnik), w programie będą dwa kopie tego samego wektora. Oznacza to, że ciało funkcyjne będzie miało kopię wektora w pamięci, która różni się od oryginalnego wektora poza ciałem funkcyjnym. Jednym ze sposobów uniknięcia takich dwóch kopii, ale nadal ma dwie zmienne, jest przejście przez odniesienie. W ten sposób zmienna w ciele funkcyjnym i zmienna poza ciałem funkcyjnym odnoszą się do tego samego wektora.

Przekazywanie wektora przez odniesienie do funkcji

Łatwo jest przekazać wektor przez odniesienie do funkcji. Aby to zrobić, mieć oryginalny wektor poza funkcją; Niech parametr definicji funkcji będzie deklaracją wektora z AMPERS-i (&), między typem wektora a nazwą parametru. Nazwa parametrów wektora i oryginalna nazwa wektora może być inna. Oryginalna nazwa wektora jest argumentem wywołania funkcji. W ten sposób nazwa wektora w ciele funkcyjnym i nazwa wektora poza ciałem funkcyjnym to dwie różne nazwy odnoszące się do tego samego wektora.

Wyobraź sobie wektor nazw zwierząt. Kierowanie się do programu byłoby:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;

Wektor poza funkcją może być:

wektor Animals = „Tiger”, „Wolf”, „Lion”, „Giraffe”, „Bear”;

Funkcja zainteresowania może być:

void fn (wektor & vtr)
dla (int i = 0; iCout << vtr[i] << ", ";
Cout << endl;

W tym momencie nazwa wektora poza funkcją to zwierzęta, a nazwa wektora wewnątrz funkcji to vtr. Oba nazwy odnoszą się do tego samego obiektu wektora w pamięci. Jeśli jakikolwiek element wektora zostanie zmieniony w funkcji, zmiana będzie widoczna w zmiennej wektorowej poza funkcją. Jeśli jakikolwiek element wektora zostanie zmieniony poza funkcją, zmiana będzie widoczna w zmiennej wektorowej wewnątrz funkcji. Jednak w tym programie nie dokonano takiej zmiany. Funkcja po prostu wyświetla zawartość wektora, która jest taka sama w funkcji i poza funkcją. Zwróć uwagę na użycie i pozycję symbolu oraz w deklaracji parametrów. Główną funkcją C ++ może być:

int main ()

fn (zwierzęta);
powrót 0;

Zmienna nazwa wektora poza funkcją jest argumentem wywołania funkcji. Wyjście to:

Tygrys, wilk, lew, żyrafa, niedźwiedź,

UWAGA: Gdy tylko funkcja rozpocznie się wykonywanie, w funkcji wykonano następującą instrukcję:

wektor & vtr = zwierzęta;

Deklaracja ta jest bardzo podobna do podstawowej deklaracji obiektu powyżej, czyli:

char & ref = var;

Wniosek

Normalna nazwa, jak i nazwa odwołana wektora są synonimami tego samego wektora. Oznacza to, że odnoszą się do tej samej lokalizacji pamięci. Aby przekazać wektor do funkcji przez odniesienie, deklaracja parametrów wektora w nawiasach funkcji musi mieć i między typem wektora a nazwą wektora. Ta nazwa w nawiasach jest oficjalnie nazwa odniesiona. Na wywołaniu funkcji normalna nazwa oryginalnej zmiennej wektorowej poza definicją funkcji staje się argumentem funkcji. Dwie nazwiska mogą być inne. W definicji funkcji i nie poprzedza nazwy wektora.