2017-06-23 2 views
0
#include <iostream> 
#include <vector> 

using namespace std; 

void factorial(vector<int> ivec, typename vector<int>::iterator iter) 
{ 
    vector<int>::iterator it; 
    for (it = iter; it != ivec.end(); it++) 
     cout << *it << endl; 
} 

int main() 
{ 
    vector<int> ivec; 
    for (int i = 1; i < 8; i++) 
     ivec.push_back(i); 

    factorial(ivec, ivec.begin()); 

    return 0; 
} 

Dans Visual Studio 2015, il montre,conteneur en tant que paramètre de fonction

enter image description here

mais si je laisse ivec être un type de référence (vector<int> & ivec), il fonctionnera avec succès.

Pourquoi?


Le code est mauvais, mauvais, mauvais ,, alors s'il vous plaît vous concentrer sur la question.

Répondre

0

Parce que vous passez le vecteur en valeur en le copiant et en rendant it != ivec.end() indéfini.

Lorsque vous passez par la valeur que vous faites quelque chose comme

vector<int> v1 = {1,2,3,4,5,6,7}; 
vector<int> v2 = v1; 
//v2 is a copy of v1 

v1.end() == v2.end(); 
//comparing end of different vectors don't have any sense. 

Lorsque vous passez par référence que vous faites quelque chose comme

vector<int> v1 = {1,2,3,4,5,6,7}; 
vector<int>& v2 = v1; 
//v2 is a reference to v1, it's like an alias 

v1.end() == v2.end(); 
//it makes sense because v2 is v1, not a copy 

Ou si vous êtes plus familier avec les pointeurs

vector<int> v1 = {1,2,3,4,5,6,7}; 
vector<int>* v2 = &v1; 

v1.end() == v2->end(); 
1

Parce que l'itérateur est relatif au conteneur, vous les obtenez. Puisque vous passez votre vecteur par valeur, c'est comme un second vecteur, et cela ne fait pas de send de comparer un itérateur du premier vecteur et un itérateur du copié.