Je code en C ++. Si j'ai une fonction void foo(vector<int> test)
et que je l'appelle dans mon programme, le vecteur sera-t-il passé par valeur ou référence? Je ne suis pas sûr parce que je sais que les vecteurs et les tableaux sont similaires et qu'une fonction comme celle- void bar(int test[])
ci passerait le test par référence (pointeur?) Au lieu de par valeur. Je suppose que je devrais passer le vecteur par pointeur / référence explicitement si je voulais éviter de passer par valeur, mais je ne suis pas sûr.
94
Réponses:
Si je devais deviner, je dirais que vous êtes d'origine Java. Il s'agit de C ++, et les choses sont passées par valeur sauf si vous spécifiez le contraire en utilisant
&
-operator (notez que cet opérateur est également utilisé comme opérateur 'address-of', mais dans un contexte différent). Tout cela est bien documenté, mais je vais quand même réitérer:Vous pouvez également choisir de passer un pointeur sur un vecteur (
void foo(vector<int> *bar)
), mais à moins que vous ne sachiez ce que vous faites et que vous estimiez que c'est vraiment la voie à suivre, ne le faites pas.De plus, les vecteurs ne sont pas les mêmes que les tableaux! En interne, le vecteur garde la trace d'un tableau dont il gère la gestion de la mémoire pour vous, mais il en va de même pour de nombreux autres conteneurs STL. Vous ne pouvez pas passer un vecteur à une fonction qui attend un pointeur ou un tableau ou vice versa (vous pouvez accéder au (pointeur vers) le tableau sous-jacent et l'utiliser cependant). Les vecteurs sont des classes offrant beaucoup de fonctionnalités via ses fonctions membres, tandis que les pointeurs et les tableaux sont des types intégrés. De plus, les vecteurs sont alloués dynamiquement (ce qui signifie que la taille peut être déterminée et modifiée à l'exécution) tandis que les tableaux de style C sont alloués statiquement (sa taille est constante et doit être connue au moment de la compilation), ce qui limite leur utilisation.
Je vous suggère de lire un peu plus sur C ++ en général (en particulier la désintégration des tableaux ), puis de jeter un œil au programme suivant qui illustre la différence entre les tableaux et les pointeurs:
la source
A
vector
est fonctionnellement identique à un tableau. Mais, à la languevector
est un type, etint
est aussi un type. Pour un argument de fonction, un tableau de n'importe quel type (y comprisvector[]
) est traité comme un pointeur. Avector<int>
n'est pas identique àint[]
(au compilateur).vector<int>
est non-tableau, non-référence et non-pointeur - il est passé par valeur, et par conséquent, il appellera copy-constructor.Donc, vous devez utiliser
vector<int>&
(de préférence avecconst
, si la fonction ne le modifie pas) pour le passer comme référence.la source
void foo(vector<int> test)
vecteur serait passé par valeur dans ce.
Vous avez plus de façons de passer des vecteurs en fonction du contexte: -
1) Passer par référence: - Cela permettra à la fonction foo de changer votre contenu du vecteur. Plus efficace que le passage par valeur car la copie du vecteur est évitée.
2) Passer par const-reference: - C'est efficace et fiable quand vous ne voulez pas que la fonction change le contenu du vecteur.
la source
lorsque nous passons vecteur par valeur dans une fonction en tant qu'argument, cela crée simplement la copie du vecteur et aucun effet ne se produit sur le vecteur défini dans la fonction principale lorsque nous appelons cette fonction particulière. tandis que lorsque nous passons le vecteur par référence tout ce qui est écrit dans cette fonction particulière, chaque action va s'exécuter sur le vecteur qui est défini dans la fonction principale ou une autre fonction lorsque nous appelons cette fonction particulière.
la source