Funkcja zwracająca wektor w C ++

Funkcja zwracająca wektor w C ++
Czy funkcja może zwrócić wektor w C++? Powodem, dla którego to pytanie jest zadane, jest to, że funkcja nie może zwrócić tablicy (podobnej do wektora) w C++. Odpowiedź jest prosta. Tak, funkcja może zwrócić wektor w C ++ i na różne sposoby. W tym artykule wyjaśniono różne sposoby, w jakie funkcja C ++ może zwrócić wektor.

Aby kodować wektor w C ++, biblioteka wektorowa musi być uwzględniona w programie. Biblioteka wektorowa ma klasę wektorową, z której można utworzyć obiekty wektorowe (utworzyć).

Program, w którym wszystkie próbki kodu tego artykułu zaczynają się od:

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

Stosuje się wektor ciągów.

Treść artykułu

- Zwracanie wektora według normalnej nazwy wektora

- Zwracanie dosłownego wektora

- Zwracanie odniesienia wektorowego

- Zwracanie wskaźnika wektorowego

- Wniosek

Zwracanie wektora według normalnej nazwy wektora

Niech wektor zainteresowania będzie:

wektor Store = „chleb”, „mięs”, „ryż”, „sos pomidorowy”, „ser”;

Wektor to lista przedmiotów w małym sklepie spożywczym. Nazwa, magazyn tego wektora, należy wysłać jako argument do funkcji, której parametr jest wektor, ale z nazwą VTR. Funkcja zainteresowania może być:

wektor FN (wektor vtr)
powrót vtr;

Zwróć uwagę na typ zwrotu definicji funkcji. Nazwa wektora to sklep. To jest argument dotyczący wywołania funkcji. Parametr funkcji odpowiadającej wektorowi jest:

wektor vtr

Zauważ, że argument funkcji i nazwy parametru są różne (nadal mogą być takie same). Gdy tylko funkcja rozpocznie się wykonywanie, składa się następującą instrukcję:

wektor vtr = sklep;

To stwierdzenie jest równoważne z następującymi dwoma stwierdzeniami:

wektor Store = „chleb”, „mięs”, „ryż”, „sos pomidorowy”, „ser”;
wektor vtr = sklep;

I tak, VTR to kopia wektora, sklepu. W tym momencie istnieją dwa wektory z tą samą treścią w pamięci dla programu. Odpowiednią główną funkcją C ++ dla kodu może być:

int main ()

wektor v = fn (sklep);
dla (int i = 0; iCout << v[i] << ", ";
Cout << endl;
powrót 0;

Zwróć uwagę, że Słowna sklep jest argumentem wywołania funkcji. Gdy funkcja jest wywoływana, w pamięci występują dwie kopie tej samej zawartości wektora. Funkcja (wywołanie) zwraca wektor, który jest odbierany przez inny wektor, v. Do czasu zakończenia programu istnieją trzy wektory tej samej kopii w pamięci. Te trzy kopie tej samej zawartości można zmniejszyć do jednej kopii za pomocą wektora odniesienia lub wektora wskaźnika. Dane wyjściowe dla powyższego programu to:

chleb, mięso, ryż, sos pomidorowy, ser,

Zwracanie dosłownego wektora

Dzisiaj (w 2022 r.) Literał wektorowy jest taki sam jak literał tablicy. Ten literał nazywa się listą inicitizer_list, dziś w c++. Zwracanie literatu wektorowego przez funkcję jest takie samo, jak zwrócenie listy inicjalizatora. Niech initLializer_List będzie:

„Chleb”, „Mięso”, „Rice”, „Sos pomidorowy”, „Cheese”

Niech definicja funkcji zwróci inicitizer_list,

wektor fn ()
powrót „chleb”, „mięs”, „ryż”, „sos pomidorowy”, „ser”;

Lista inicjalizator jest składana na miejscu w instrukcji powrotnej i zwrócona. Definicja funkcji nie ma parametru, ale ma ten sam typ zwrotu co jej odpowiednik w poprzednim rozdziale. Niech główna funkcja C ++ będzie:

int main ()

wektor v = fn ();
dla (int i = 0; iCout << v[i] << ", ";
Cout << endl;
powrót 0;

Wzywanie funkcji, tym razem, nie ma argumentu, ale wartość zwracania jest odbierana przez ten sam wektor i rodzaj poprzedniej sekcji.

Do czasu zakończenia programu byłyby dwa kopie tego samego wektora w pamięci? NIE. Byłaby tylko jedna kopia, czyli v. Lista inicjalizator jest rodzajem wyrażenia, zwanego RValue. Gdy tego rodzaju wyrażenie nie jest już potrzebne w pamięci, można go usunąć przez C ++, aby mieć więcej miejsca na pamięć? Nie jest ważne, czy pozostaje w pamięci po jego użyciu, gdy program nadal działa. Zostałby wymazany, gdyby jego przestrzeń jest potrzebna. Wyjście programu to:

chleb, mięso, ryż, sos pomidorowy, ser,

Zwracanie odniesienia wektorowego

Program zrobi to, co zrobił pierwszy powyższy program, ale tylko z jedną kopią tego samego wektora. Będą jednak trzy różne nazwy tego samego wektora. Niech wektor zainteresowania będzie:

wektor Store = „chleb”, „mięs”, „ryż”, „sos pomidorowy”, „ser”;
Zmienna, sklep tutaj, to zwykła nazwa. Niech funkcja zainteresowania będzie:
wektor i FN (wektor & vtr)
powrót vtr;

Zwróć uwagę na obecność i pozycję parametru i w parametrze. Oznacza to, że VTR jest wektorem odwołanym (synonimowym), a nie kopią argumentu, który ma zostać wysłany. Zwróć uwagę na obecność i pozycję i w typu powrotu. Oznacza to, że odniesienie (synonim) wektora zostanie zwrócone przez funkcję. Zauważ, że wewnętrzne stwierdzenie „powrót VTR;” nie ma &. Niech główna funkcja C ++ będzie:

int main ()

wektor *v = & fn (sklep);
dla (int i = 0; irozmiar(); i ++)
Cout << (*v)[i] << ", ";
Cout << endl;
powrót 0;

Podpis definicji funkcji i instrukcja wywołania funkcji to:

wektor i FN (wektor i VTR)

I

wektor *v = & fn (sklep);

odpowiednio. Zwróć uwagę, obecność i pozycja i, w typu powrotu definicji funkcji. Zwróć uwagę na obecność i pozycję i w instrukcji wywołania funkcji. Argumentem wywołania funkcji jest zwykła nazwa wektora, sklep. Funkcja zwraca odniesienie i jest odbierana przez wskaźnik, v.

I tak w programie są trzy różne zmienne, wszystkie odnoszące się do tej samej lokalizacji pamięci wektorowej (funkcja zwrócona i VTR, która jest synonimem sklepu). Wyjście to:

chleb, mięso, ryż, sos pomidorowy, ser,

Zwracanie wskaźnika wektorowego

Program zrobi to, co zrobił pierwszy powyższy program, ale tylko z jedną kopią tego samego wektora. Będą trzy różne nazwy tego samego wektora. Niech wektor zainteresowania będzie:

wektor Store = „chleb”, „mięs”, „ryż”, „sos pomidorowy”, „ser”;
Zmienna, sklep tutaj, to zwykła nazwa. Niech funkcja zainteresowania będzie:
wektor * fn (wektor *vtr)
powrót vtr;

Zwróć uwagę na obecność i pozycję * w parametrze. Oznacza to, że VTR jest wektorem wskaźnikiem, a nie kopią żadnego argumentu wektora, który ma zostać wysłany. Zwróć uwagę na obecność i pozycję * w typu powrotu. Ponownie zauważ, że wewnętrzne stwierdzenie „zwróć vtr;” nie ma i lub *. Niech główna funkcja C ++ będzie:

int main ()

wektor *v = fn (i sklep);
dla (int i = 0; irozmiar(); i ++)
Cout << (*v)[i] << ", ";
Cout << endl;
powrót 0;

Podpis definicji funkcji i instrukcja wywołania funkcji to:

wektor * fn (wektor *vtr)

I

wektor *v = fn (i sklep);

odpowiednio. Zwróć uwagę na obecność i pozycję * w typu zwrotnym definicji funkcji. Zwróć uwagę na obecność i pozycję i w instrukcji wywołania funkcji; Jest przed argumentem, sklepem, a nie przed fn (), który nie ma i lub *. Funkcja zwraca odniesienie i jest odbierana przez wskaźnik, v.

I tak w programie są trzy różne zmienne, wszystkie odnoszące się do tej samej lokalizacji pamięci wektorowej. Wyjście to:

chleb, mięso, ryż, sos pomidorowy, ser,

Wniosek

Funkcja może zwrócić wektor po swojej normalnej nazwie. Funkcja może zwrócić literał wektorowy (inicjalizator_list), który zostanie odebrany przez normalny wektor (nazwa). Wektor może zwrócić odniesienie wektorowe, które zostanie odebrane przez wskaźnik wektorowy. Wektor może zwrócić wskaźnik wektorowy, który jest jeszcze odbierany przez inny wskaźnik wektorowy.