2017-06-21 1 views
-3

est sous l'extrait, je tiens à souligner la variable first à la variable second sans copier le vecteur:Modifier un vecteur en changeant son pointeur ne fonctionne pas en C++?

#include <iostream> 
#include <vector> 

std::vector<int> second (4,100); 
void modify(std::vector<int>* i) { 
    i = &second; 
} 
int main() 
{ 
    std::vector<int> first;        // empty vector of ints 
    modify(&first); 
    for (std::vector<int>::iterator it = first.begin(); it != first.end(); ++it) 
    std::cout << ' ' << *it; 

    std::cout << '\n'; 

    return 0; 
} 

La sortie est vide, alors que je pensais que la sortie soit 100 100 100 100.

Est-ce que quelqu'un a des idées sur pourquoi je ne peux pas modifier le vecteur comme ça?

+1

Pouvez-vous "modifier" un 'int' en changeant son pointeur de la même façon? Peut-être que cela n'a rien à voir avec les vecteurs? – juanchopanza

Répondre

2

Vous passez le pointeur par valeur. Cela signifie que tout ce que vous changez de pointeur dans la fonction ne sera pas vu en dehors de la fonction. Ce que vous devez faire est de passer le pointeur par référence si vous voulez voir les changements dans le site d'appel. Cela ne fonctionnera pas dans ce cas, bien que depuis

modify(&first); 

est un pointeur rvalue et ne peut pas être lié à un non const lvalue référence.

Tout cela n'est pas nécessaire. Nous pouvons simplement changer la fonction de prendre une référence comme

void modify(std::vector<int>& i) { 
    i = second; 
} 

puis modify(&first); devient modify(first); et maintenant les changements seront reflétés dans main().

+0

Merci! Est-ce une copie par valeur ou une copie par référence? –

+0

@HanfeiSun Ma suggestion est de passer par référence au lieu de par pointeur par valeur. – NathanOliver

+0

@HanfeiSun son appelé passer par référence. Les copies sont toujours "en valeur" si vous voulez l'appeler comme ça – user463035818

0

On dirait que vous vouliez ceci:

void modify(std::vector<int>* i) { 
    *i = second; 
} 

il est moyen de modifier la valeur par le paramètre « ancien » et peut-être un problème:

void modify(std::vector<int>* i) { 
    if(!i) { 
     // what should I do? 
     throw std::runtime_exception("cannot modify vector through nullptr"); 
    } 
    *i = second; 
} 

cette vérification supplémentaire peut être évité en utilisant référence à la place qui rendrait aussi votre intention plus claire au lecteur du code, sauf si vous voulez vraiment passer nullptr parfois pour une raison quelconque (dire la fonction de ne pas changer la valeur, mais faire quelque chose d'autre par exemple).