Fonction renvoyant un vecteur en C ++

Fonction renvoyant un vecteur en C ++
Une fonction peut-elle renvoyer un vecteur en c++? La raison pour laquelle cette question est posée, c'est parce qu'une fonction ne peut pas renvoyer un tableau (qui est similaire à un vecteur) en C++. La réponse est simple. Oui, une fonction peut renvoyer un vecteur en C ++ et de différentes manières. Cet article explique les différentes façons dont une fonction C ++ peut renvoyer un vecteur.

Afin de coder un vecteur en C ++, la bibliothèque vectorielle doit être incluse dans le programme. La bibliothèque vectorielle possède la classe vectorielle à partir de laquelle les objets vectoriels peuvent être instanciés (créés).

Le programme dans lequel tous les échantillons de code de cet article commencent par:

#inclure
#inclure
#inclure
Utilisation de Namespace Std;

Un vecteur de cordes est utilisé.

Contenu de l'article

- Vector de retour par nom de vecteur normal

- Retourner un vecteur littéral

- Retour d'une référence vectorielle

- Retourner un pointeur vectoriel

- Conclusion

Vector de retour par nom de vecteur normal

Que le vecteur d'intérêt soit:

vecteur Store = "Bread", "Meat", "Rice", "Tomato Sauce", "Cheese";

Le vecteur est une liste d'articles dans une petite épicerie. Le nom, magasin de ce vecteur, doit être envoyé comme argument à une fonction, dont le paramètre est un vecteur, mais avec le nom, vtr. La fonction d'intérêt peut être:

vecteur FN (vecteur vtr)
retour vtr;

Remarquez le type de retour de la définition de la fonction. Le nom du vecteur est le magasin. C'est l'argument pour l'appel de la fonction. Le paramètre de la fonction correspondant au vecteur est:

vecteur vtr

Notez que l'argument pour la fonction et le nom du paramètre sont différents (ils peuvent toujours être les mêmes). Dès que la fonction commence à s'exécuter, l'instruction suivante est faite:

vecteur vtr = store;

Cette déclaration équivaut aux deux déclarations suivantes:

vecteur Store = "Bread", "Meat", "Rice", "Tomato Sauce", "Cheese";
vecteur vtr = store;

Et donc, VTR est une copie du vecteur, magasin. À ce stade, il y a deux vecteurs avec le même contenu en mémoire pour le programme. Une fonction principale C ++ appropriée pour le code peut être:

int main()

vecteur v = fn (magasin);
pour (int i = 0; icouter << v[i] << ", ";
couter << endl;
retour 0;

Notez que le magasin de mots est l'argument de l'appel de la fonction. Lorsque la fonction est appelée, deux copies du même contenu vectoriel se produisent en mémoire. La fonction (appel) renvoie un vecteur, qui est reçu par un autre vecteur, v. À la fin du programme, il y a trois vecteurs de la même copie en mémoire. Ces trois copies du même contenu peuvent être réduites à une copie en utilisant un vecteur de référence ou un vecteur de pointeur. La sortie du programme ci-dessus est:

pain, viande, riz, sauce tomate, fromage,

Retourner un vecteur littéral

Aujourd'hui (en 2022), un littéral vectoriel est le même qu'un plateau littéral. Ce littéral est appelé un initialiseur_list, aujourd'hui en c++. Ainsi, renvoyer un littéral vectoriel par une fonction, c'est le même que le renvoi d'un initialiseur_list. Soit l'initializer_list:

"pain", "viande", "riz", "sauce tomate", "fromage"

Laissez la définition de la fonction pour retourner l'initizaliser_list,

vecteur fn ()
Retour "pain", "viande", "riz", "sauce tomate", "fromage";

L'initialisation_list est composé sur place dans l'instruction de retour et retourné. La définition de la fonction n'a pas de paramètre, mais a le même type de retour que son homologue dans la section précédente. Soit la fonction principale C ++:

int main()

vecteur v = fn ();
pour (int i = 0; icouter << v[i] << ", ";
couter << endl;
retour 0;

L'appel de fonction, cette fois, n'a pas d'argument, mais la valeur de retour est reçue par le même vecteur et le même type de la section précédente.

À la fin du programme, il y aurait deux copies du même vecteur en mémoire? Non. Il n'y aurait qu'une seule copie, qui est V. L'initialisation_list est une sorte d'expression, appelée un RValue. Lorsque ce type d'expression n'est plus nécessaire en mémoire, peut-il être effacé par C ++ afin d'avoir plus d'espace mémoire? Il n'est pas important s'il reste en mémoire une fois qu'il a été utilisé pendant que le programme continue de fonctionner. Il serait effacé si son espace était nécessaire. La sortie du programme est:

pain, viande, riz, sauce tomate, fromage,

Retour d'une référence vectorielle

Le programme ici fera ce que le premier programme ci-dessus a fait, mais seulement avec une copie du même vecteur. Il y aura trois noms différents pour le même vecteur, cependant. Que le vecteur d'intérêt soit:

vecteur Store = "Bread", "Meat", "Rice", "Tomato Sauce", "Cheese";
La variable, magasin ici, est un nom ordinaire. Que la fonction d'intérêt soit:
vecteur & fn (vecteur & vtr)
retour vtr;

Notez la présence et la position de & dans le paramètre. Cela signifie que VTR est un vecteur (synonyme) référencé, et non une copie de l'argument à envoyer. Notez la présence et la position de & dans le type de retour. Cela signifie que la référence (synonyme) d'un vecteur sera retournée par la fonction. Notez que l'instruction intérieure, «Retour Vtr;» n'a pas &. Que la fonction principale C ++ soit:

int main()

vecteur * v = & fn (magasin);
pour (int i = 0; itaille(); i ++)
couter << (*v)[i] << ", ";
couter << endl;
retour 0;

La signature de la définition de la fonction et l'instruction d'appel de fonction sont:

vecteur & fn (vecteur & vtr)

et

vecteur * v = & fn (magasin);

respectivement. Remarque encore, la présence et la position de &, dans le type de retour de la définition de la fonction. Notez la présence et la position de et dans l'instruction d'appel de fonction. L'argument de l'appel de la fonction est le nom ordinaire du vecteur, magasin. La fonction renvoie une référence, et elle est reçue par un pointeur, v.

Et donc, il existe trois variables différentes dans le programme, toutes faisant référence au même emplacement de mémoire vectorielle (la fonction retournée et VTR, qui est synonyme de magasin). La sortie est:

pain, viande, riz, sauce tomate, fromage,

Retourner un pointeur vectoriel

Le programme ici fera ce que le premier programme ci-dessus a fait, mais seulement avec une copie du même vecteur. Il y aura trois noms différents pour le même vecteur. Que le vecteur d'intérêt soit:

vecteur Store = "Bread", "Meat", "Rice", "Tomato Sauce", "Cheese";
La variable, magasin ici, est un nom ordinaire. Que la fonction d'intérêt soit:
vecteur * FN (vecteur * vtr)
retour vtr;

Notez la présence et la position de * dans le paramètre. Cela signifie que VTR est un vecteur de pointeur, et non une copie d'un argument vectoriel à envoyer. Notez la présence et la position de * dans le type de retour. Encore une fois, notez que l'instruction intérieure, «Retour Vtr»; n'a pas et ou *. Que la fonction principale C ++ soit:

int main()

vecteur * v = fn (& store);
pour (int i = 0; itaille(); i ++)
couter << (*v)[i] << ", ";
couter << endl;
retour 0;

La signature de la définition de la fonction et l'instruction d'appel de fonction sont:

vecteur * FN (vecteur * vtr)

et

vecteur * v = fn (& store);

respectivement. Notez la présence et la position de * dans le type de retour de la définition de la fonction. Notez la présence et la position de & dans l'instruction d'appel de fonction; Il est devant l'argument, le magasin et pas devant FN (), qui n'a pas & ou *. La fonction renvoie une référence, et elle est reçue par un pointeur, v.

Et donc, il existe trois variables différentes dans le programme, toutes faisant référence au même emplacement de mémoire vectorielle. La sortie est:

pain, viande, riz, sauce tomate, fromage,

Conclusion

Une fonction peut renvoyer un vecteur par son nom normal. Une fonction peut renvoyer un vecteur littéral (initializer_list), à recevoir par un vecteur normal (nom). Un vecteur peut retourner une référence vectorielle, à recevoir par un pointeur vectoriel. Un vecteur peut retourner un pointeur vectoriel, encore à recevoir par un autre pointeur vectoriel.